﻿var
  texte = ["Autoren, deren Namen mit $ beginnt",
           "Titel, welche die Zeichen $ beinhalten",
           "Verlage, deren Namen mit $ beginnt",
           "Gefundene Schlagworte, die mit $ beginnen",
           "t"],        //Ausgabetexte nach Ergebnisanzeige
  
  xha,                   //xmlHttp-Objekt für Index- und Detaildaten
  
  spalte = 0,           //Verweis auf ausgewähltes Inputfeld
  suchtext = {},        //Verweis auf Editierfeld
  srcIndex = 0,         //Aktuell markiertes Element in der Vorschlagsliste 
  srcCount = 0,         //Anzahl der Einträge in der Vorschlagsliste
  timeOutId,            //Verweis auf aktuell eingestellte TimeOut-Funktion
    
  asfData = {
    index : {
      d_0 : {index : []}, //First-Lever-Index und Indexdaten für Autor
      d_1 : {index : []}, //First-Lever-Index und Indexdaten für Titel
      d_2 : {index : []}, //First-Lever-Index und Indexdaten für Titel
      d_3 : {index : []}, //First-Lever-Index und Indexdaten für Titel
      aktuell : ""      //aktuell angeforderter Index für Indexdateien
    },
    detail : {
      aktuell : "",     //aktuell angeforderter Index für Detaildaten
      angefordert : -1, //angeforderte Datensatz-ID
      lstIndex : -1     //Index der in der Vorschlagsliste markierte Datensatz
    }
  };    
  
function asfInit(){               //Aufruf bei body.onload
  suchtext = document.getElementById("id_src_0");
  self.focus();
  suchtext.focus();
  xha = getXMLHTTP();
  for (var i=0; i<4; i++) document.getElementById("id_src_" + i).onkeyup=asfKey;
}

function getIndexCounter(){          //Ermittlung der aktuellen Indexdatei anhand von Suchtext und Spalte
var i = 1;
var tmp = asfData.index["d_" + spalte].index;
  while (i < tmp.length){
    if (tmp[i][0]>suchtext.value.toLowerCase()) break;
    i++;
  }
  return tmp[i-1][1];
}

function getDetailCounter(){          //Ermittlung der aktuellen Detaildatei anhand der angeforderten Datensatz-ID
var idx = asfData.detail.angefordert, 
    tmp = Number((idx - (idx % 100)) / 100).toFixed(0);
  if (idx<1000) tmp = String().concat("0", tmp);
  return tmp;
}

function detailfensterSichtbar(mode){ //Ein- und Ausblenden der Detailanzeige
  document.getElementById("id_detail").style.visibility = (mode ? "visible" : "hidden");
}

function lstStateChanged(){             //Indexdaten geladen
  if (xha.readyState == 4 && xha.status == 200){
    //Neues Array im Objekt asfData.index[spalte] mit geladenen Daten anlegen
    asfData.index["d_" + spalte][asfData.index.aktuell] = String(xha.responseText).split(/\r\n/);
    listeAnzeigen();
  }
}

function listeAngefordert(){         //Suchergebnisse angefordert
  if (suchtext.value.length < 1){
    document.getElementById("id_res_caption").innerHTML = 
      "Der Suchtext benötigt mindestens ein Zeichen."; 
    return;
  }
  asfData.index.aktuell = getIndexCounter();
  //Prüfung, ob Daten bereits geladen sind
  if (asfData.index["d_" + spalte][asfData.index.aktuell]){
    listeAnzeigen(); 
    return;
  } 
  if (xha != null){
    xha.open("GET", "data/d_" + spalte + "_" + asfData.index.aktuell + ".txt");
    xha.onreadystatechange = lstStateChanged;
    xha.send(null);
  }
}

function listeAnzeigen(){            //Anzeige Suchergebnisse
  for (var i=0; i<4; i++) document.getElementById("id_src_d" + i).style.visibility = "hidden";
  document.getElementById("id_res_caption").innerHTML = 
    texte[spalte].replace("$", "'" + suchtext.value + "'") + ":";
  var tmp = new Array(), x="", cnt=0, max = 20, akt=0;
  for (var i=0; i<asfData.index["d_" + spalte][asfData.index.aktuell].length; i++){
    tmp = asfData.index["d_" + spalte][asfData.index.aktuell][i].split("\t");
    if (tmp[0].substr(0, suchtext.value.length).toLowerCase() == suchtext.value.toLowerCase()){
      cnt += 1; 
      if (cnt==1) akt = tmp[3];
      x += "<div id=\"id_res_list_" + (cnt<10?"0":"") + cnt + "\" onclick=\"javascript:detaildatenAngefordert(" + tmp[3] + "," + cnt + ");\"" + 
        " class=\"data_entry\">" +
        "<div class=\"Autor\">" + tmp[1] + (tmp[1]=="" ? "&gt; Ohne Autor &lt;" : "") + "</div>" +
        "<div class=\"Titel\">" + tmp[2] + (tmp[2]=="" ? "&gt; Ohne Titel &lt;" : "") + "</div>" +
        "</div>";
      if (cnt > max && max > 0) {
        x += ". . . .<br /><br /><div class=\"Hinweis\">" + 
          "Es existieren weitere Einträge. Verfeinern Sie eventuell Ihr Suchkriterium.</div>";
        break;
      }
    }
  }
  document.getElementById("id_res_list").innerHTML = x;
  asfData.detail.lstIndex = 1; detaildatenAngefordert(akt, 1);
}

function dtlStateChanged(){           //Detaildaten geladen
  if (xha.readyState == 4 && xha.status == 200){
    //Neues Array im Objekt asfData.detail mit geladenen Daten anlegen
    asfData.detail[asfData.detail.aktuell] = String(xha.responseText).split(/\r\n/);
    detaildatenAnzeigen();
  }
}

function detaildatenAngefordert(id, idx){ //Dateildaten angefordert
  asfData.detail.angefordert = id; asfData.detail.lstIndex = idx;
  asfData.detail.aktuell = getDetailCounter();
  //Prüfung, ob Daten bereits geladen sind
  if (asfData.detail[asfData.detail.aktuell]){
    detaildatenAnzeigen();
    return;
  }
  if (xha != null){
    xha.open("GET", "data/z_" + asfData.detail.aktuell + ".txt");
    xha.onreadystatechange = dtlStateChanged;
    xha.send(null);
  } 
}

function detaildatenAnzeigen(){       //Detaildaten anzeigen
  for (var i=1; ;i++){
    var tmp = "id_res_list_" + (i<10?"0":"") + i;
    var ele = document.getElementById(tmp);
    if (ele){
      if (i==asfData.detail.lstIndex) ele.className = "data_entry data_entry_hl"; else ele.className = "data_entry";
    } else {
      break;
    }
  }
  for (var i=0; i<asfData.detail[asfData.detail.aktuell].length;i++){
    var tmp = asfData.detail[asfData.detail.aktuell][i];
    tmp = tmp.substring(tmp.lastIndexOf("\t")+1, tmp.length);
    if (tmp == asfData.detail.angefordert){
      var tmp = asfData.detail[asfData.detail.aktuell][i].split("\t");
      var spalten = ["Autor", "Titel", "Untertitel", "Ort", "Verlag", "Erscheinungsjahr", "Zustand", "Schlagwort", "Preis", "Bemerkungen"];
      for (var s = 0; s<spalten.length; s++)
        document.getElementById("id_detail_" + spalten[s]).innerHTML = tmp[s] + (tmp[s]=="" ? "&nbsp;" : "");
      detailfensterSichtbar(true);
      return;
    }
  }
}

function igf(x){
  for (var i = 0; i<4; i++) if(i != x) document.getElementById("id_src_" + i).value = "";
  spalte = x;
  suchtext = document.getElementById("id_src_" + x);
//  document.getElementById("id_res_caption").innerHTML = "";
//  document.getElementById("id_res_list").innerHTML = "";
//  document.getElementById("id_detail").style.visibility = "hidden";
  for (var i=0; i<4; i++) document.getElementById("id_src_d" + i).style.visibility = "hidden";
}

function asfKey(e){
  if (!e) e=window.event;
  if (e.keyCode==37 || e.keyCode==39) return;
  if (e.keyCode==40 && srcIndex==srcCount && srcIndex>0) return;
  if (e.keyCode==13){listeAngefordert(); return;}
  if (e.keyCode==38 && srcIndex>0) {srcIndex--; srcListeSetzen(); return;}
  if (e.keyCode==40 && srcIndex<srcCount) {srcIndex++; srcListeSetzen(); return;}
  timeOutId = window.setTimeout("vorschlagslisteAnzeigen()", 500);
}

function srcListeSelektiert(x){
  for (var i = 1; i<srcCount; i++) document.getElementById("id_src_d" + spalte + "_" + i).className = "src_entry";
  var active = document.getElementById("id_src_d" + spalte + "_" + x);
  active.className = "src_entry src_selected";
  srcIndex = x;
}

function srcListeSetzen(){
  for (var i=1; i<=srcCount; i++) document.getElementById("id_src_d" + spalte + "_" + i).className = "src_entry";
  if (srcIndex==0) return;
  var active = document.getElementById("id_src_d" + spalte + "_" + srcIndex);
  document.getElementById("id_src_" + spalte).value = active.innerHTML;
  active.className = "src_entry src_selected";
}

function vorschlagslisteAnzeigen(){
  window.clearTimeout(timeOutId);
  if (suchtext.value.length < 1) return;

  asfData.index.aktuell = getIndexCounter();
  //Prüfung, ob Daten bereits geladen sind
  if (asfData.index["d_" + spalte][asfData.index.aktuell]){
    vorschlagAnzeigen(); 
    return;
  } 
  if (xha != null){
    xha.open("GET", "data/d_" + spalte + "_" + asfData.index.aktuell + ".txt");
    xha.onreadystatechange = srcStateChanged;
    xha.send(null);
  }
}

function vorschlagAnzeigen(){
  var tmp = new Array(), x="", cnt=0, max = 8, lastValue="";
  for (var i=0; i<asfData.index["d_" + spalte][asfData.index.aktuell].length; i++){
    tmp = asfData.index["d_" + spalte][asfData.index.aktuell][i].split(/\t/);
    if (tmp[0].substr(0, suchtext.value.length).toLowerCase() == suchtext.value.toLowerCase() &&
      tmp[0] != lastValue){
      cnt += 1; lastValue = tmp[0];
      x += "<div id=\"id_src_d" + spalte + "_" + cnt + "\" onclick=\"javascript:suchtext.value='" + tmp[0] + "';listeAngefordert();\"" + 
        " onmouseover=\"javascript:srcListeSelektiert(" + cnt + ");\" class=\"src_entry\">" + tmp[0] + "</div>";
    }
    if (cnt==max) break;
  }
  var dest = document.getElementById("id_src_d" + spalte);
  dest.innerHTML = x;
  if (cnt>0) dest.style.visibility = "visible"; else dest.style.visibility = "hidden";
  srcCount = cnt; srcIndex = 0;
}

function srcStateChanged(){             //Indexdaten geladen
  if (xha.readyState == 4 && xha.status == 200){
    //Neues Array im Objekt asfData.index[spalte] mit geladenen Daten anlegen
    asfData.index["d_" + spalte][asfData.index.aktuell] = String(xha.responseText).split(/\r\n/);
    vorschlagAnzeigen();
  }
}

