// bedit_allow = "phrase";
dtype = "ue" ; // default is Uyghur-English

function initSuggest() {
  oTextbox = new AutoSuggestControl(document.getElementById("phrase"), new Suggestions());
}

function selectDictype ( type ) {
 var tf = document.getElementById ( "phrase" ) ;

 if ( type.length == 2 ) {
    type = type.replace(/u/g, 'ug');
    type = type.replace(/e/g, 'en');
    type = type.replace(/c/g, 'cn');

    if ( type.length != 4 ) {
       if ( console ) {
          console.error("wrong 2-letter type: " + type);
       }

       return;
    }

    type = type.substr(0,2) + '_' + type.substr(2,2);
 }

 switch ( type ) {
    case 'ug_ug':
       shownote("ئىزاھلىق لۇغەت");
       break;
    case 'ug_en':
       shownote("Uyghur-English");
       break;
    case 'ug_cn':
       shownote("ئۇيغۇرچە-خەنزۇچە 维汉");
       break;
    case 'en_en':
       shownote("English-English");
       break;
    case 'en_ug':
       shownote("ئىنگىلىزچە-ئۇيغۇرچە");
       break;
    case 'en_cn':
       shownote("English-Chinese 英汉");
       break;
    case 'cn_cn':
       shownote("汉汉词典");
       break;
    case 'cn_ug':
       shownote("خەنزۇچە-ئۇيغۇرچە 汉维");
       break;
    case 'cn_en':
       shownote("Chinese-English 汉英"); 
       break;
    case 'ar_en':
       shownote("Arabic-English"); 
       break;
    case 'en_ar':
       shownote("English-Arabic"); 
       break;
    default:
       var arr = type.split('_');
       if ( arr.length == 2 && src_dst_names[ arr[0] ] && src_dst_names [ arr[1] ] ) {
          var note = src_dst_names[ arr[0] ] + ' - ' + src_dst_names[ arr[1] ] ;
          shownote(note);
       } else {
          shownote("");
       }
       break;
 }

 var ud   = document.getElementById('divhelp_uy');
 var hd   = document.getElementById('divhelp_cn');
 var ed   = document.getElementById('divhelp_en');
 var wd   = document.getElementById('nwords');
 var md   = document.getElementById('div_idiomhelp');
 var ush  = document.getElementById('uy_sdef_holder');
 var esh  = document.getElementById('en_sdef_holder');
 var csh  = document.getElementById('cn_sdef_holder');
 var chh  = document.getElementById('cn_shelp_holder');
 var dic  = document.getElementById('divhelp_input_cn');

 ud.style.display = 'none';
 hd.style.display = 'none';
 ed.style.display = 'none';
 wd.style.display = 'none';
 md.style.display = 'none';
 ush.style.display = 'none';
 esh.style.display = 'none';
 csh.style.display = 'none';
 chh.style.display = 'none';
 dic.style.display = 'none';

 if ( type == 'cn_cn' || type == 'cn_ug' || type == 'cn_en' ) {
    hd.style.display = 'block';

    if ( type == 'cn_cn' ) {
       md.style.display = 'block';
       csh.style.display = 'block';
    }

    if ( type == 'cn_cn' || type == 'cn_ug' ) {
       chh.style.display = 'block';

       var csd = document.getElementById('cn_shelp');
       if ( csd && csd.checked == true ) { 
          dic.style.display = 'block';
       }
    }
 } else if ( type == 'en_en' || type == 'en_ug' || type == 'en_cn' ) {
    ed.style.display = 'block';

    if ( type == 'en_en' ) {
       esh.style.display = 'block';
    }
 } else if ( type == 'ug_ug' || type == 'ug_cn' || type == 'ug_en' ) {
    ud.style.display = 'block';

    if ( type == 'ug_ug' ) {
       ush.style.display = 'block';
       wd.style.display = 'block';
    }
 }

 if ( type != dtype ) {
    if ( type.charAt(0) != dtype.charAt(0) ) { // clear input if language changes
       tf.value = "" ;
    }

    dtype = type ;

    if ( dtype.substr(0,3) == 'ug_' ) {
       tf.dir = "rtl" ;
       tf.style.direction = "rtl" ;
       tf.align = "right" ;
       tf.size = 11;
       tf.className = 'phrase_ug';
       imode = 0 ; // uyghur input
    } else if ( dtype.substr(0,3) == 'en_' ) {
       tf.dir = "ltr" ;
       tf.style.direction = "ltr" ;
       tf.align = "left" ;
       tf.size = 15;
       tf.className = 'phrase_en';
       imode = 1 ; // non-Uyghur input
    } else if ( dtype.substr(0,3) == 'cn_' ) {
       tf.dir = "ltr" ;
       tf.style.direction = "ltr" ;
       tf.align = "left" ;
       tf.size = 15;
       tf.className = 'phrase_cn';
       imode = 1 ; // non-Uyghur input
    } else if ( dtype.substr(0,3) == 'ar_' ) {
       tf.dir = "rtl" ;
       tf.style.direction = "rtl" ;
       tf.align = "right" ;
       tf.size = 11;
       tf.className = 'phrase_ar';
       imode = 2 ; // Arabic input
    } else if ( dtype.substr(0,3) == 'ur_' ) {
       tf.dir = "rtl" ;
       tf.style.direction = "rtl" ;
       tf.align = "right" ;
       tf.size = 11;
       tf.className = 'phrase_ur';
       imode = 1 ; // no Urdu keyboard support for now
    } else {
       tf.dir = "ltr" ;
       tf.style.direction = "ltr" ;
       tf.align = "left" ;
       tf.size = 15;
       tf.className = 'phrase_en';
       imode = 1 ; // non-Uyghur input
    } 
 }

 var d = document.getElementById('dictype');
 d.value = type;

 tf.focus() ;
}

function mo ( type ) { //
 if ( ! document.getElementById ) {
    return;
 }

 var d = document.getElementById('mainarea');
 d.style.cursor = 'pointer';
}

function tf_insert ( str )
{
  var tf = document.getElementById ( "phrase" ) ;

  if ( document.all ) {
    // there is no easy way to find the current cursor position in IE.
    // we just add to the end of the text.
    tf.value = tf.value + str ; 
    var range = tf.createTextRange();
    range.collapse(true);
    range.moveEnd('character', tf.value.length);
    range.moveStart('character', tf.value.length);
    range.select();
  } else {
    var selstart = tf.selectionStart ;
    var selend = tf.selectionEnd ;
    tf.value = tf.value.substring (0, selstart) + str + tf.value.substr ( selend) ;
    tf.setSelectionRange(selstart + str.length, selstart + str.length );
  }
  tf.focus();
}

function mt ( type ) {
  var d = document.getElementById('mainarea');
  d.style.cursor = 'default';
}

function toggleSearchDef(did, sub_did) {
  var d = document.getElementById(did);
  var s = document.getElementById(sub_did);

  if ( !d ) {
    return;
  }

  if ( d.checked == true ) {
    s.style.display = 'block';
  } else {
    s.style.display = 'none';
  }
}

function oc ( type ) {
 selectDictype(type);
 return;
}

function shownote(note)
{
  var d = document.getElementById('divnote');
  d.innerHTML = note;
}

function validate ( )
{
 var tf = document.getElementById ( "phrase" ) ;
 var p = trim(tf.value) ;

 var err = document.getElementById ( "err" ) ;
 err.style.display = "none" ;

 if ( p.length == 0 ) {
    err.innerHTML = "ئىزدەيدىغان سۆز كىرگۈزۈڭ." ;
    err.style.display = "block" ;
    return false ;
 }

 // check if the input is valid for the current selected direction
 if ( dtype == 'ug_en' || dtype == 'ug_cn' || dtype == 'ug_ug' ) {
    if ( ! isValidUy(p) ) { // input language is Uyghur, but string is not
       err.innerHTML = "كىرگۈزگەن ئىبارە ئۇيغۇرچە ئەمەس." ;
       err.style.display = "block" ;
       return false;
    }
 } else if ( dtype == 'en_ug' || dtype == 'en_cn' || dtype == 'en_en' ) {
    if ( ! isValidEn(p) ) { // input language is English, but string is not
       err.innerHTML = "Please enter a phrase in English" ;
       err.style.display = "block" ;
       return false;
    }
 } else if ( dtype == 'cn_cn' || dtype == 'cn_ug' ) {
    /* in Chinese-Chinese and Chinese-Uyghur direction, we accept Chinese 
     * characters or pinyin (with or without space/tone). Others not accepted.
     */
    p = p.replace(/（.）$/g, ''); // some words are given with alternative chars in Chinese parens
    p = p.toLowerCase(); // we just use all lower case pinyin
    if ( ! isValidCn(p) && ! isValidPinyin(p) ) { 
       err.innerHTML = "请输入汉字或拼音" ;
       err.style.display = "block" ;
       return false;
    }

    var csdef = document.getElementById ( "cn_sdef" ) ;
    if ( dtype == 'cn_cn' && csdef.checked && ! isValidCn(p) ) {
       err.innerHTML = "为解释查询、请输入汉字" ;
       err.style.display = "block" ;
       return false;
    }
 } else if ( dtype == 'cn_en' ) {
    // in Chinese-English direction, we only accept Chinese characters (no pinyin).
    if ( ! isValidCn(p) ) { 
       err.innerHTML = "请输入汉字" ;
       err.style.display = "block" ;
       return false;
    }
 }

 do_query(p);

 return false ;
}

// checks if str is a valid Uyghur character string
function isValidUy ( str ) {
 for ( i = 0; i < str.length; i++ ) {
    code = str.charCodeAt(i);
    ch = String.fromCharCode(code) ; 

    if ( (BPAD <= code && code <= BPAD + 0xFF) || (0xFB50 <= code && code <= 0xFDFF) || (0xFE70 <= code && code <= 0xFEFF) || ch == ' ' || ch == '-' || ch == '.' ) {
       continue;
    } else {
       return false;
    }
 }

 return true;
}

// checks if str is a valid English character string
function isValidEn ( str ) {
 for ( i = 0; i < str.length; i++ ) {
    code = str.charCodeAt(i);

    // we used 0xFF, instead of 0x7F for extended Latin
    if ( code < 0xFF ) {
       continue;
    } else {
       return false;
    }
 }

 return true;
}

// checks if str is a valid Chinese character string
function isValidCn ( str ) {
 // we check the following four ranges to see if character is a valid in Unicode
 var CJK_UNI_PAD = 0x4E00;
 var CJK_UNI_MAX = 0x9FBF;
 var CJK_EXT_A_PAD = 0x3400;
 var CJK_EXT_A_MAX = 0x4DBF;
 var CJK_EXT_B_PAD = 0x20000;
 var CJK_EXT_B_MAX = 0x2A6DF;
 var CJK_SUP_PAD = 0x2F800;
 var CJK_SUP_MAX = 0x2FA1F;

 for ( i = 0; i < str.length; i++ ) {
    code = str.charCodeAt(i);
    ch = String.fromCharCode(code) ; 

    if ( (CJK_UNI_PAD <= code && code <= CJK_UNI_MAX) || // CJK unified ideographs
         (CJK_EXT_A_PAD <= code && code <= CJK_EXT_A_MAX) || // CJK ideographs ext. A
         (CJK_EXT_A_PAD <= code && code <= CJK_EXT_A_MAX) || // CJK ideographs ext. B
         (CJK_SUP_PAD <= code && code <= CJK_SUP_MAX) || // CJK ideographs supplement 
         ch == '，'
       )
    {
       continue;
    } else {
       return false;
    }
 }

 return true;
}

function isValidPinyin ( str ) {
 var pinyin_letters = " abcdefghijklmnopqrstuvwxyzāáǎàēéěèīíǐìōóǒòūúǔùüǖǘǚǜ";

 for ( i = 0; i < str.length; i++ ) {
    code = str.charCodeAt(i);
    ch = String.fromCharCode(code); 

    if ( pinyin_letters.indexOf(ch) == -1 ) {
       return false;
    }
 }

 return true;
}

function ascii2latin1(str)
{
   var s;
   var regex;

   s = str;
   s = s.replace(/:e/i, "é"); 
   s = s.replace(/:o/i, "ö"); 
   s = s.replace(/:u/i, "ü"); 

   return s;
}

function dtfix()
{
 var d = document.getElementById ( "dictype" ) ;
 var u = decodeURI(top.location.href).toLowerCase();
 var dt = "";
 var ph = "";
 var url_string = "yulghun.com/";

 // check links that supply parameters for dictionary type and query phrase
 var qidx = u.indexOf("?");
 var yidx = u.indexOf(url_string);

 if ( yidx == -1 ) {
    url_string = "lughet.com/";
    yidx = u.indexOf(url_string);
 } 

 if ( qidx > 0 ) {
    // this assumes URL is given in /?dt=direction&ph=phrase or 
    // in /?dictype=direction&phrase=phrase format
    var qry = u.substr(qidx + 1);

    if ( qry && qry.length > 0 ) {
       var arr = qry.split('&'); // split parameter pairs
       for ( i = 0; i < arr.length; i++ ) {
          var sarr = arr[i].split('='); // split parameter type and its value
          if ( sarr.length == 2 ) {
             if ( sarr[0] == 'dictype' || sarr[0] == 'dt' ) {
                dt = sarr[1];
             } else if ( sarr[0] == 'phrase' || sarr[0] == 'ph' ) {
                ph = sarr[1];
             }
          }
       }
    }
 } else if ( yidx + url_string.length + 1 < u.length ) {
    // this assumes URL is given in /dt/phrase format 
    yidx += url_string.length; 
    var qry = u.substr(yidx);

    if ( qry.length > 1 ) {
       var sarr = qry.split('/'); // split parameter type and its value

       if ( sarr.length >= 2 ) {
          dt = sarr[0];
          ph = sarr[1];

          if ( ph.indexOf("uly:") == 0 ) {
             ph = ph.substring(4);
             ph = ascii2latin1(ph);
             ph = uly2uy(ph);
          }
       } else {
          dt = qry;
       }
    }
 }

 updateRecentSearches('','');

 var sfp = document.getElementById('searchform_plain');
 if ( sfp && sfp.checked ) {
    searchform_toggle('plain');
    proc_src_change(dt);
 }

 if ( dt == 'ug_ug' || dt == 'ug_en' || dt == 'ug_cn' || dt == 'en_en' || dt == 'en_ug' || 
      dt == 'en_cn' || dt == 'cn_cn' || dt == 'cn_ug' || dt == 'cn_en' ) {
    oc(dt);

    if ( ph.length > 0 ) {
       var tf = document.getElementById ( "phrase" ) ;
       tf.value = ph; // populate "phrase"
       validate(); // ask validate to perform checks and do query if everything is ok
    }
 } else { // no (valid) dictionary type is detected, fall back to default behaviour
    oc(d.value);
 }
}

var src_dst = new Array();
src_dst['ug'] = [ 'en', 'cn', 'ug' ];
src_dst['cn'] = [ 'ug', 'en', 'fr', 'de', 'jp', 'cn' ];
src_dst['en'] = [ 'ug', 'ar', 'cn', 'de', 'fr', 'ru', 'tr', 'en' ];
src_dst['ar'] = [ 'en' ] ;
src_dst['fr'] = [ 'en', 'cn', 'fr' ] ;
src_dst['de'] = [ 'en', 'cn', 'ru' ] ;
src_dst['ru'] = [ 'en', 'de', 'cn' ] ;
src_dst['jp'] = [ 'en', 'cn' ] ;
src_dst['ur'] = [ 'ug' ] ;

var src_dst_names = new Array();
src_dst_names['ar'] = 'العربيّة';
src_dst_names['cn'] = '汉语';
src_dst_names['de'] = 'Deutsch';
src_dst_names['en'] = 'English';
src_dst_names['fr'] = 'Français';
src_dst_names['jp'] = '日本語';
src_dst_names['ru'] = 'Русский';
src_dst_names['tr'] = 'Türkçe';
src_dst_names['ug'] = 'ئۇيغۇرچە';
src_dst_names['ur'] = 'اردو';

function proc_src_change(dt)
{
   var i;
   var s = document.getElementById('src');
   var d = document.getElementById('dst');

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

   var idx = s.selectedIndex;
   var sval = s.value;
   var item = s.options[idx];

   var dstlist = src_dst[sval];

   d.options.length = 0;
   for ( i = 0; i < dstlist.length; i++ ) {
     d.options[i] = new Option(src_dst_names[ dstlist[i] ], dstlist[i], i == 0 ? true : false, false );
     d.options[i].style.className = 'phrase_' + dstlist[i];
   }

   var dval = d.value;
   var dt = document.getElementById ( "dictype" ) ;
   if ( dt ) {
      dt.value = sval + '_' + dval;
   }

   oc(dt.value);
}

function proc_dst_change()
{
   var i;
   var s = document.getElementById('src');
   var d = document.getElementById('dst');

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

   var sval = s.value;
   var dval = d.value;

   var dt = document.getElementById ( "dictype" ) ;
   if ( dt ) {
      dt.value = sval + '_' + dval;
   }

   oc(dt.value);
}
   
function search_form_click(e)
{
   if ( ! e ) {
      e = event;
   }

   var rb = e.target || e.srcElement;
 
   searchform_toggle(rb.value);
}

function searchform_toggle(type)
{
   var g = document.getElementById('imagemap');
   var p = document.getElementById('plainsearch');
   var i = document.getElementById('divinput');
   var d = document.getElementById('divdef');
   var s = document.getElementById('divspacer');

   if ( !g || !p || !i || !d ) {
      return;
   }

   if ( type == 'graphical' ) {
      g.style.display = 'block';
      p.style.display = 'none';
      s.style.display = 'none';

      i.style.top = '-168px';
      d.style.top = '-75px';
   } else {  // plain
      g.style.display = 'none';
      p.style.display = 'block';
      s.style.display = 'block';

      i.style.top = '0px';
      d.style.top = '0px';

      var dt = document.getElementById ( "dictype" ) ;
      var arr = dt.value.split('_');
      if ( arr.length == 2 ) {
         var sval = arr[0];
         var dval = arr[1];

         var s = document.getElementById('src');
         var d = document.getElementById('dst');

         if ( d && s ) {
            var i;
            for ( i = 0; i < s.options.length; i++ ) {
               if ( s.options[i].value == sval ) {
                  s.selectedIndex = i;
               }
            }

            if ( d.options.length == 0 ) {
               proc_src_change(dt.value)
            }

            for ( i = 0; i < d.options.length; i++ ) {
               if ( d.options[i].value == dval ) {
                  d.selectedIndex = i;
               }
            }
         }
      }
   }

   var tf = document.getElementById ( "phrase" ) ;
   if ( tf ) {
     tf.focus();
   }
}
