//  ---------------------------------------------------------------------------
var showAllFlag = false;
var visibility = true;
var formVisible = false;
var matchMode = 1; var exact = 0; var starting = 1; var match = 2;
var resultListFlag = false;
var letters = new Array ("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0");
//  var umlauts = "%FC%E4%F6%DF%DC%C4%D6%0A";
var umlauts = "üäößÜÄÖ";
var umReplace = new Array ("ue", "ae", "oe", "ss", "Ue", "Ae", "Oe");
var umCode = new Array ("&uuml;", "&auml;", "&ouml;", "&szlig;", "&Uuml;", "&Auml;", "&Ouml;");
var dAll = 0; 
var gAll = 0; 
var fAll = 0;
var dictMode = 0; var current = 0; var all_open = 1; var all = 2;
var myThreads = new Array (letters.length);
var nFound = 0; 
var entry;
var repeatTag = ' ';  //'"';
var oldValue = "";
var highlightFound = true; 

//  for (var i=0; i< myThreads.length; i++)
//    myThreads[i] = new Array (1);

//  ---------------------------------------------------------------------------
//  alert (highlight ("Es war einmal eine glückliche Zeit", "Glück", false));
//  alert (deTag (highlight ("Es war einmal eine glückliche Zeit", "Glück", false)));
function highlight (s, pattern, caseSensitive) { // still flawed
  var from = 0;
  if (caseSensitive)
    from = s.indexOf (pattern);
  else
    from = s.toLowerCase().indexOf(pattern=pattern.toLowerCase());
  if (from < 0) return s;
  return s.substr(0, from)+"<b>"+s.substr (from, pattern.length)+"</b>"+(((from+pattern.length) < s.length) ? s.substr(from+pattern.length): "");
}

//  ---------------------------------------------------------------------------
function deTag (s) {
  if (s.length < 3) return s;
  if (s.indexOf ("<") < 0) return s;
  var tagOn = false;
  var out = "";
  for (var i=0; i < s.length; i++) 
    if (s.charAt (i) == "<")
      if (tagOn)
        out+= s.charAt (i);
      else
        tagOn = !tagOn;
    else
      if (s.charAt(i) == ">")
        if (tagOn)
          tagOn = !tagOn;
        else
          out+= s.charAt(i);
      else
        if (!tagOn)
          out+= s.charAt(i);
  return out;
}

//  ---------------------------------------------------------------------------
function deUmlaut (s) {
  var out = new Array (1);
  var delta=0;
  for (var i=0; i < s.length; i++) {
    var j = umlauts.indexOf(s.charAt(i));
    if (j < 0)
      out [i+delta] = s.charAt(i);
    else
      out [i+delta++] = umReplace [j];
  }
  return out.join ("");
}

//  ---------------------------------------------------------------------------
function codeUmlaut (s) {
  trace ('codeUmlaut ('+s+')');
  var out = new Array (1);
  var delta=0; var m = 0;
  for (var i=0; i < s.length; i++) {
    m = umlauts.indexOf(s.charAt(i));
    if (m < 0)
      out [i+delta] = s.charAt(i);
    else
      for (var j=0; j < umCode[m].length; j++) 
        out [i+delta++] = umReplace[m].charAt(j);
  }
  traceln ('--&gt; '+out.join (""));
  return out.join ("");
}

//  alert('1: '+unescape(umlauts)); alert('2: '+umlauts); alert ('3: '+deUmlaut(umlauts)); alert ('ü ('+'ü'.charCodeAt(0)+') =='+umlauts.charAt(0)+' ('+umlauts.charCodeAt(0)+')'); 
// alert ('Äther--> "'+deUmlaut('&Auml;ther'+repeatTag));


//  ---------------------------------------------------------------------------
function showAll (prefix) {
  showAllFlag = !showAllFlag;
  setLineVisibility ('farsi', showAllFlag);
  for (i=0; i < letters.length; i++) 
    if (document.getElementById (prefix+letters[i]) != null) 
     setLineVisibility (prefix+letters[i], showAllFlag);
}

//  ---------------------------------------------------------------------------
function toggleAllVisibility (prefix) {
  var tmpVisibility = visibility;
  for (i=0; i < letters.length; i++) 
    if (document.getElementById (prefix+letters[i]) != null) {
      visibility = tmpVisibility;
      toggleVisibility (prefix+letters[i]);
    }
}

//  ---------------------------------------------------------------------------
function toggleVisibility (id) {
  visibility = !visibility;
  var dictTable = document.getElementById (id);
  var lines = dictTable.getElementsByTagName ('div');
  var fields = '';
  var n = lines.length;
  for (var i = 0; i < n; i++) {
    fields = lines[i].getElementsByTagName ('span');
    fields[0].style.display = (visibility ? 'inline' : 'none');
    fields[1].style.width   = (visibility ? '20%' : '38%');
    fields[2].style.display = (visibility ? 'inline' : 'none');
    fields[3].style.width   = (visibility ? '50%' : '60%');
  }
}

//  ---------------------------------------------------------------------------
function setFieldVisibility (id, visibility) {
  var dictTable = document.getElementById (id);
  var lines = dictTable.getElementsByTagName ('div');
  var fields = '';
  var n = lines.length; 
  var m = 0;
  for (var i = 0; i < n; i++) {
    fields = lines[i].getElementsByTagName ('span');
    fields[0].style.display = (visibility ? 'inline' : 'none');
    fields[1].style.width   = (visibility ? '20%' : '38%');
    fields[2].style.display = (visibility ? 'inline' : 'none');
    fields[3].style.width   = (visibility ? '50%' : '60%');
    if (fields[3].innerHTML == repeatTag) m++;
  }
  return n-m-1;
}

//  ---------------------------------------------------------------------------
function countDe (id) {
  var lines = document.getElementById (id).getElementsByTagName ('div');
  var fields = '';
  var m = 0;
  for (var i = 0; i < lines.length; i++) 
    if (lines[i].getElementsByTagName ('span')[3].innerHTML == repeatTag)
      m++;
  return lines.length-m-1;
}

//  ---------------------------------------------------------------------------
function setLineVisibility (id, visibility) {
  var dictTable = document.getElementById (id);
  var lines = dictTable.getElementsByTagName ('div');
  for (var i = 0; i < lines.length; i++) 
    lines[i].style.display = (visibility ? 'inline' : 'none');
  return lines.length;
}

//  ---------------------------------------------------------------------------
function toggleForm () {
  formVisible = !formVisible;
  document.getElementById ('lookup').style.display =  (formVisible ? 'block' : 'none');
}

//  ---------------------------------------------------------------------------
function lookUp (value, id) {
  var wordy = false; 
  if (wordy) alert ('search "'+value+'" in '+id);
//  value = deUmlaut (value.toLowerCase());
  var dictTable = document.getElementById (id);
  try {
    var lines = dictTable.getElementsByTagName ('div');
  }
  catch (e) { 
    alert ('### '+e+': search "'+value+'" in '+id+' dictionary not found!');
    return 0;
  }
  var fields = '';
  var n = lines.length;
  var n_fa = 0;
  var iPos = 0;
  var same = false;
  var found = false;
  var searchField = "";
  if (wordy) alert ('search "'+value+'" in '+dictTable.id+' ('+n+')');
  for (var i = 1; i < n; i++) {
    fields = lines[i].getElementsByTagName ('span');
    same = (fields[3].innerHTML==repeatTag) && found;
    lines[i].style.display = 'none';
    found = false;
    if (highlightFound) fields[3].innerHTML = deTag (fields[3].innerHTML);
    searchField = deUmlaut (fields[3].innerHTML.toLowerCase());
    iPos = searchField.indexOf (value);
    if ((iPos >= 0) || same)
      if (same || (((matchMode==0) && (iPos==0) && (searchField.length==value.length)) || ((matchMode==1) && (iPos==0)) || (matchMode==2))) {
        found = true;
        lines[i].style.display = 'block';
        if (!same) {
          n_fa++;
          if (highlightFound) {  // think again! and take umlauts into account - not trivial.
            fields[3].innerHTML = highlight (fields[3].innerHTML, oldValue, false);
          }
        }
        lines[i].style.backgroundColor = (n_fa%2 ? '#F0F8FF' : 'white');
      }
  }
  dictTable.style.display =  (n_fa > 0 ? 'block' : 'none');
  if (wordy) alert ("end lookUp, "+n_fa+' matches found');
  insertHTML (n_fa+' '+(document.body.lang=='de' ? deText [0] : enText[0]+(n_fa==1?'':'s')), 'hits');
  if (resultListFlag) listResults(value);
  return n_fa;
}

//  ---------------------------------------------------------------------------
function listResults(value) {
  var w = window.open("", "results_for_"+value, ""); 
  var d = w.document; // Hole das Document-Objekt des neuen Fensters
  var n_fa_Found = 0; var n_de_Found = 0;
  var fields = '';
  d.writeln('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">');
  d.writeln('<HTML>');
  d.writeln('<head>');
  d.writeln('  <meta name="GENERATOR" content="hand coded by Horst Walther" />');
  d.writeln('  <title>Horst Walther - dictionry lookup results for "'+value+'</title>');
  d.writeln('  <link rel="stylesheet" href="http://www.horst-walther.de/style/privat.css"  type="text/css" />');
  d.writeln('  <link rev="OWNER" href="mailto:mail@Horst-Walther.de" />');
  d.writeln('  <script type="text/javascript" language="javascript" src="http://www.horst-walther.de/js/insertHTML.js"></script>');
  d.writeln('  <script type="text/javascript" language="javascript" src="http://www.horst-walther.de/js/showtime.js"></script>');
  d.writeln('  <script type="text/javascript" language="javascript" src="http://www.horst-walther.de/js/dictionary.js"></script>');
  d.writeln('  <script type="text/javascript" language="javascript">var visibility = false;</script>');
  d.writeln('  <script type="text/javascript" language="javascript" src="http://www.horst-walther.de/js/errPage.js"></script>');
  d.writeln('</head>');
  d.writeln('<body lang="en" onload ="insertHTML (\'Horst Walther, Hamburg, \'+makeTime(),\'dateTime\')">');
  d.writeln('<center>')
  d.writeln('<H1 align="center">results of search for "'+value+'":</H1>'); 
  for (j=0; j < letters.length; j++) {
    var n_fa=0; n_de = 0;
    var dictTable = document.getElementById ('dict_'+letters[j]);
    var lines = dictTable.getElementsByTagName ('div');
    if (lines.length > 0) {
      for (var i = 0; i < lines.length; i++) 
        if (lines[i].style.display !=  'none') {
          n_fa++;
          fields = lines[i].getElementsByTagName ('span');
          if (fields[3].innerHTML != repeatTag) n_de++;
          if (n_fa ==1) {
            d.writeln('<div id="table_'+letters[j]+'" class="PersTable">');
          }
          d.writeln('  <div>'+lines[i].innerHTML+'</div>');
        } 
      if (n_fa > 0) {
        d.writeln('</div>');
        d.writeln('<p>'+n_fa+' ('+n_de+') '+(document.body.lang=='de' ? deText [0] : enText[0]+(n_fa==1?'':'s'))+' in '+letters[j]+'<\/p>');
      }
      n_fa_Found += n_fa;
      n_de_Found += n_de;
    }
  }
  d.writeln('<p>'+n_fa_Found+' ('+n_de_Found+') '+(document.body.lang=='de' ? deText [0]+' insgesamt' : 'total '+enText[0]+(n_fa==1?'':'s'))+'<\/p>');
  d.writeln('</center>')
  d.writeln('<hr />'); 
  d.writeln('<br /><br />');

  d.writeln('<div class="footer">');
  d.writeln('  <a class="plainlink" href="http://www.horst-walther.de/index.htm">&nbsp;home&nbsp;</a>');
  d.writeln('  <a class="plainlink" href="persisch.htm">&nbsp;&lt;&nbsp;</a>');
  d.writeln('  <a class="plainlink" href="lookup.htm">&nbsp;^&nbsp;</a>');
  d.writeln('  <a class="plainlink" href="TransHoWa.htm">&nbsp;&gt;&nbsp;</a>');
  d.writeln('  <input type="button" class="plainlink" Value="visibility" onClick="toggleAllVisibility(\'table_\')" />');
  d.writeln('  <input id="Value0" type="button" class="plainlink" onClick="javascript:window.print()" value="print" />&nbsp;');
  d.writeln('  <div id="dateTime" class="signature">&nbsp;</div>');
  d.writeln('</div>');

  d.writeln('</body>');
  d.writeln('</html>');
  d.close ();
}

//  ---------------------------------------------------------------------------
function index (letter1) {
  if (letter1.length != 1) return letters.length-1;
  for (var i = 0; i < letters.length; i++) {
    if (letters[i].toLowerCase().indexOf (letter1.toLowerCase()) >= 0) return i;
  }
  return letters.length-1;
}

//  ---------------------------------------------------------------------------
function processed (letter1) {
  return (document.getElementById('doc_'+letter1).innerHTML == 'done');
}

//  ---------------------------------------------------------------------------
function loadDone (letter1) {
  return (document.getElementById('table_'+letter1) != null);
}

//  ---------------------------------------------------------------------------
function processDict (/*value,*/ loadId, letter1, iL, text) {
  var value = entry;
  var wordy = false;
//      document.getElementById('trace').innerHTML += 'processDict ('+letter1+', '+loadId+', '+iL+', '+text+'), dictMode='+dictMode+', matchMode='+matchMode+'='+myThreads[iL] +'<br \/>';
  if (!processed (letter1)) {
    if (!loadDone (letter1)) {
      insertHTML ('Dictionary "'+letter1+'" loading from '+text+' ...', 'hits');
      return false;
    }
    var obj = document.getElementById('table_'+letter1);
//    insertHTML ('<span style="text-decoration: blink; color: red">'+(document.body.lang=='de' ? deText[2] : enText[2])+'&nbsp;&quot;'+letter1+'&quot;'+'<\/span>', 'hits');
//        document.getElementById('trace').innerHTML += 'process dictionary "'+letter1+'" '+'<br \/>';
    document.getElementById('dict_'+letter1).innerHTML = obj.innerHTML;
    document.getElementById('letter_'+letter1).style.textDecoration = "none";
    document.getElementById('dAll').innerHTML = ++dAll;
    var n_de = setFieldVisibility ('dict_'+letter1, false);
    document.getElementById('gLen_'+letter1).innerHTML = n_de;
    var n_fa = obj.getElementsByTagName ('div').length-1;
    document.getElementById('fLen_'+letter1).innerHTML = n_fa;
    document.getElementById('doc_'+letter1).innerHTML = 'done';
    var n = setLineVisibility ('dict_'+letter1, false);
    insertHTML (letter1+" : "+n_de+' German entries, '+n_fa+' Farsi entries loaded', 'hits');
    document.getElementById('gAll').innerHTML = (gAll+=n_de);
    document.getElementById('fAll').innerHTML = (fAll+=n_fa);
    document.getElementById('inText').focus();
  }
//  document.getElementById('trace').innerHTML += 'processing finished: window.clearInterval(myThreads['+iL+']):'+letter1+'='+myThreads[iL] +'<br \/>';
  window.clearInterval(myThreads[iL]); //[value.length-1]);
  myThreads[iL]/*[value.length-1]*/ = null;
  nFound+=lookUp (value, 'dict_'+letter1);
//      lines[iL+1].style.backgroundColor = '#efefef'; //  border = "1px solid silver";
  if (wordy) alert (nFound+' entries of '+value+' found in '+'dict_'+letter1);
  document.getElementById('inText').focus();
  return true;
}

//  ---------------------------------------------------------------------------
function loadDict (ii) {
  var slashFlag = document.URL.indexOf ('\\') < 0;
  var selfURL = document.URL.slice(document.URL.lastIndexOf(slashFlag ? '/' : '\\')+1);
//  document.getElementById('trace').innerHTML += 'loading dictionary "'+letters[ii]+'" from '+preFix+letters[ii]+postFix+')'+'<br \/>';
  loadToID (preFix+letters[ii]+postFix, 'doc_'+letters[ii], function () {null});//"alert ('"+preFix+letters[ii]+postFix+" loaded')");
//  document.getElementById('letter_'+letters[ii]).focus();
  document.getElementById('letter_'+letters[ii]).style.textDecoration = "blink";
  document.getElementById('gLen_'+letters[ii]).innerHTML = "...";
  document.getElementById('fLen_'+letters[ii]).innerHTML = "...";
  document.getElementById('hits').innerHTML = preFix+letters[ii]+postFix+' still loading! Please wait a second';
}

//  ---------------------------------------------------------------------------
function lookUpDict (value, id) {
  var wordy = false; 
  if (wordy) alert ('lookUpDict ('+value+', '+id+')');
  oldValue = value;
  value = deUmlaut(value.toLowerCase());
  entry = value;
  setLineVisibility ('farsi', false);
  var letter1 = letters [index (value.slice (0,1))];
  nFound = 0; 
  for (var i= (dictMode && (matchMode==2) ? 0 : index (letter1));
           i< (dictMode && (matchMode==2) ? letters.length : index (letter1)+1);
           i++) {
    if (processed (letters[i]))
      nFound+=lookUp (value, 'dict_'+letters[i]);
    else {
      if (!(loadDone (letters[i])))
        if (myThreads[i]/*[value.length-1]*/ == null)
          if (dictMode!=all_open) {
            loadDict (i);
            myThreads[i]/*[value.length-1]*/ = window.setInterval("processDict ('"/*+value+"', '"*/+id+"', '"+letters[i]+"', "+i+", '"+preFix+letters[i]+postFix+"')", 250);
          }
    }
  }
  insertHTML (nFound+' '+(document.body.lang=='de' ? deText [0] : enText[0]+(nFound==1?'':'s')), 'hits');
}
//  ---------------------------------------------------------------------------