// Suchen mit JavaScript
// =====================
//
// Funktionen zur Durchfuehrung der Suche
//
// Autor: Dietmar Rabich
//        http://www.rabich.de/
//
// Datum: 14.1.2000

// --- Interne Variablen ---

// Dokumente
var        eingabe        = parent.frames["menu"].document
var        ausgabe        = parent.frames["anz"].document

// Variablen fuer die Suche
var        anzahl_eintraege        = 0
var        max_fundstellen                = 0
var        max_bewertung                = 0
var        eintraege                = new Array()

// Parameter
var        copyright_anzeige        = false
var        farbe_bgcolor                = "#FFFFFF"
var        farbe_text                = "#000000"
var        farbe_link                = "#0000FF"
var        farbe_alink                = "#0000FF"
var        farbe_vlink                = "#0000FF"
var        farbe_hover                = "#009F00"

// Suchworte
var        query

// Statusvariablen
var        sortierung                = "W"
var        suchwortzaehlung        = true
var        und_verknuepfung        = true
var        kompakt                        = false
var        gross_klein                = false
var        suche_titel                = true
var        suche_url                = true
var        suche_kategorie                = true
var        suche_beschreibung        = true
var        suche_schluesselworte        = false

// Bewertungsschema
var        wert_titel                = 5
var        wert_url                = 5
var        wert_kategorie                = 3
var        wert_beschreibung        = 2
var        wert_schluesselworte        = 1

// Maximale Ausgabelaengen
// (-1 = unbeschraenkt)
var        limit_titel                = 100
var        limit_url                = -1
var        limit_kategorie                = 100
var        limit_beschreibung        = 250
var        limit_schluesselworte        = 200

// --- Funktionen ---

// Ermittlung, ob die Suchtexte im Eintrag nr vorhanden sind
function gefunden(nr)
{
        var        i
        var        j
        var        found
        var        ret

        var        suche        = new Array()
        var        wertung        = new Array()
        var        cnt        = 0

        // Und-Verknuepfung
        function suche_und()
        {
                for(i = 0; i < query.length; i++)
                {
                        found        = false
                        for(j = 0; j < suche.length; j++)
                        {
                                if(suche[j].indexOf(query[i]) != -1)
                                {
                                        found        = true
                                        break
                                }
                        }

                        if(!found)
                                return(false)
                }
                return true
        }

        // Oder-Verknuepfung
        function suche_oder()
        {
                for(i = 0; i < query.length; i++)
                {
                        found        = false
                        for(j = 0; j < suche.length; j++)
                        {
                                if(suche[j].indexOf(query[i]) != -1)
                                {
                                        return true
                                }
                        }
                }
                return false
        }

        // Oder-Verknuepfung (Fundstellenzaehlung)
        function suche_oder_cnt()
        {
                var        nmb        = 0
                var        lnmb
                var        w        = 0
                var        start
                var        pos

                for(i = 0; i < query.length; i++)
                {
                        for(j = 0; j < suche.length; j++)
                        {
                                start        = 0
                                lnmb        = 0
                                pos        = suche[j].indexOf(query[i], start)
                                while(pos != -1)
                                {
                                        lnmb++
                                        start        = pos + query[i].length
                                        pos        = suche[j].indexOf(query[i], start)
                                }
                                nmb        += lnmb
                                w        += lnmb * wertung[j]
                        }
                }

                eintraege[nr].fundstellen        = nmb
                if(nmb > max_fundstellen)
                        max_fundstellen        = nmb

                eintraege[nr].bewertung                = w
                if(w > max_bewertung)
                        max_bewertung        = w

                return (nmb != 0) ? true : false
        }

        // Und-Verknuepfung (Fundstellenzaehlung)
        function suche_und_cnt()
        {
                var        nmb        = 0
                var        nmb2        = 0
                var        lnmb
                var        w        = 0
                var        start
                var        pos

                for(i = 0; i < query.length; i++)
                {
                        nmb2        = 0
                        for(j = 0; j < suche.length; j++)
                        {
                                start        = 0
                                lnmb        = 0
                                pos        = suche[j].indexOf(query[i], start)
                                while(pos != -1)
                                {
                                        nmb2++
                                        lnmb++
                                        start        = pos + query[i].length
                                        pos        = suche[j].indexOf(query[i], start)
                                }
                                w        += lnmb * wertung[j]
                        }
                        if(nmb2 == 0)
                                return 0
                        nmb        += nmb2
                }

                eintraege[nr].fundstellen        = nmb
                if(nmb > max_fundstellen)
                        max_fundstellen        = nmb

                eintraege[nr].bewertung                = w
                if(w > max_bewertung)
                        max_bewertung        = w

                return (nmb != 0) ? true : false
        }

        // Eintragstexte lesen
        if(suche_titel)
        {
                wertung[cnt]        = wert_titel
                suche[cnt++]        = eintraege[nr].titel
        }
        if(suche_url)
        {
                wertung[cnt]        = wert_url
                suche[cnt++]        = eintraege[nr].url
        }
        if(suche_kategorie)
        {
                wertung[cnt]        = wert_kategorie
                suche[cnt++]        = eintraege[nr].kategorie
        }
        if(suche_beschreibung)
        {
                wertung[cnt]        = wert_beschreibung
                suche[cnt++]        = eintraege[nr].beschreibung
        }
        if(suche_schluesselworte)
        {
                wertung[cnt]        = wert_schluesselworte
                suche[cnt]        = eintraege[nr].schluesselworte
        }

        // Gross-/Kleinschreibung nicht beachten
        if(!gross_klein)
                for(i = 0; i < suche.length; i++)
                        suche[i]        = suche[i].toLowerCase()

        // = eigentliche Suche =
        eintraege[nr].fundstellen        = null
        ret        = suchwortzaehlung ?
                        (und_verknuepfung ? suche_und_cnt() : suche_oder_cnt()) :
                        (und_verknuepfung ? suche_und() : suche_oder())
        return ret
}

// Limitierung der Ausgabe
function limit(s, l)
{
        // Limit setzen?
        if(l < 0)
                return s

        // Limit ueberschritten?
        var        lg        = s.length
        if(lg <= l)
                return s

        var        ende        = "..."
        return s.substring(0, l - ende.length) + ende
}

// Konvertierung nach HTML
function toHTML(s)
{
        s        = s.replace(new RegExp("&", "g"), "&amp;")
        s        = s.replace(new RegExp("<", "g"), "&lt;")
        s        = s.replace(new RegExp(">", "g"), "&gt;")
        s        = s.replace(new RegExp("\"", "g"), "&quot;")
        s        = s.replace(new RegExp("\xDF", "g"), "&szlig;")
        s        = s.replace(new RegExp("\xC4", "g"), "&Auml;")
        s        = s.replace(new RegExp("\xD6", "g"), "&Ouml;")
        s        = s.replace(new RegExp("\xDC", "g"), "&Uuml;")
        s        = s.replace(new RegExp("\xE4", "g"), "&auml;")
        s        = s.replace(new RegExp("\xF6", "g"), "&ouml;")
        s        = s.replace(new RegExp("\xFC", "g"), "&uuml;")
        s        = s.replace(new RegExp("\xA9", "g"), "&copy;")
        s        = s.replace(new RegExp("\xE9", "g"), "&eacute;")
        s        = s.replace(new RegExp("\xE8", "g"), "&egrave;")
        s        = s.replace(new RegExp("\xE1", "g"), "&aacute;")
        s        = s.replace(new RegExp("\xE0", "g"), "&agrave;")
        s        = s.replace(new RegExp("\xC9", "g"), "&Eacute;")
        s        = s.replace(new RegExp("\xC8", "g"), "&Egrave;")
        s        = s.replace(new RegExp("\xC1", "g"), "&Aacute;")
        s        = s.replace(new RegExp("\xC0", "g"), "&Agrave;")

        return s
}

// Ausgabe eines Eintrags
function ausgabe_eintrag(nr)
{
        if(kompakt)
        {
                ausgabe.write("<P CLASS=\"Eintrag\"><SMALL><A HREF=\"" + eintraege[nr].url + "\" TITLE=\"" + eintraege[nr].url + "\" TARGET=\"anz\">" + toHTML(limit(eintraege[nr].titel, limit_titel)) + "</A>")
                if(suchwortzaehlung)
                {
                        if(eintraege[nr].bewertung >= 1)
                                ausgabe.write(" [" + String(eintraege[nr].bewertung_prozent) + "%]")
                }
                ausgabe.writeln("</SMALL></P>")
        }
        else
        {
                ausgabe.write("<P CLASS=\"Eintrag\"><SMALL><A HREF=\"" + eintraege[nr].url + "\" TITLE=\"" + eintraege[nr].url + "\" TARGET=\"anz\">" + toHTML(limit(eintraege[nr].titel, limit_titel)) + "</A><BR>")
                ausgabe.write(toHTML(limit(eintraege[nr].beschreibung, limit_beschreibung)) + "<BR>")
                ausgabe.write("<SMALL><EM>Kategorie:</EM> " + toHTML(limit(eintraege[nr].kategorie, limit_kategorie)) + "<BR>")


        }
}

// Ausgabe einer Kategorie (Titel)
function ausgabe_kategorie_titel(nm)
{
        ausgabe.writeln("<P CLASS=\"Eintrag\"><STRONG>" + toHTML(nm) + "</STRONG></P>")
}

// Ausgabe einer Kategorie (Eintrag)
function ausgabe_kategorie_eintrag(nr)
{
        ausgabe.write("<BLOCKQUOTE><P CLASS=\"Eintrag\"><SMALL><A HREF=\"" + eintraege[nr].url + "\" TARGET=\"_blank\"><IMG SRC=\"neues_fenster.gif\" WIDTH=\"16\" HEIGHT=\"16\" HSPACE=\"2\" VSPACE=\"0\" BORDER=\"0\" ALT=\"Neues Fenster &ouml;ffnen\"></A><A HREF=\"" + eintraege[nr].url + "\" TITLE=\"" + eintraege[nr].url + "\" TARGET=\"_top\">" + toHTML(limit(eintraege[nr].titel, limit_titel)) + "</A><BR>")
        ausgabe.write(toHTML(limit(eintraege[nr].beschreibung, limit_beschreibung)))
        ausgabe.writeln("</SMALL></P></BLOCKQUOTE>")
}

// Ausgabe des HTML-Headers des Dokuments
function html_header()
{
        ausgabe.open("text/html")
        ausgabe.writeln("<HTML LANG=\"de\">")
        ausgabe.writeln("<HEAD>")
        ausgabe.writeln("<TITLE>Suchergebnisse/Katalog</TITLE>")
        ausgabe.writeln("<META NAME=\"AUTHOR\" CONTENT=\"Matthias Prieser\">")
        ausgabe.writeln("<META NAME=\"PUBLISHER\" CONTENT=\"Matthias Prieser\">")
        ausgabe.writeln("<META NAME=\"COPYRIGHT\" CONTENT=\"Dietmar Rabich, D&uuml;lmen\">")
        ausgabe.writeln("<META NAME=\"LANGUAGE\" CONTENT=\"de\">")
        ausgabe.writeln("<META HTTP-EQUIV=\"CONTENT-LANGUAGE\" CONTENT=\"de\">")
        ausgabe.writeln("<META HTTP-EQUIV=\"CONTENT-TYPE\" CONTENT=\"text/html; CHARSET=iso-8859-1\">")
        ausgabe.writeln("<STYLE TYPE=\"text/css\">")
        ausgabe.writeln("<!--")
        ausgabe.writeln("A:hover {color: \"" + farbe_hover + "\";}")
        ausgabe.writeln("small { font-size:8pt; line-height:9pt; font-family:univers,geneva,verdana,arial; color:#000000; }")
        ausgabe.writeln("//-->")
        ausgabe.writeln("</STYLE>")
        ausgabe.writeln("<LINK REL=\"STYLESHEET\" TYPE=\"text/css\" HREF=\"style.css\">")
        ausgabe.writeln("<BASE TARGET=\"_top\">")
        ausgabe.writeln("</HEAD>")
        ausgabe.writeln("<BODY BGCOLOR=\"" + farbe_bgcolor + "\" TEXT=\"" + farbe_text + "\" LINK=\"" + farbe_link + "\" ALINK=\"" + farbe_alink + "\" VLINK=\"" + farbe_vlink + "\" CLASS=\"Global\">")
}

// Ausgabe des Headers der Ergebnisseite
function erg_header()
{
        ausgabe.writeln("<font face=univers,geneva,verdana,arial size=2><P CLASS=\"Titel\"><STRONG>Suchergebnisse:</STRONG></P></font>")
        ausgabe.writeln("<BLOCKQUOTE>")
}

// Ausgabe des Headers der Kategorienliste
function kat_header()
{
        ausgabe.writeln("<P CLASS=\"Titel\"><STRONG>Katalog:</STRONG></P>")
}

// Ausgabe des Footers der Ergebnisseite
function erg_footer(anz)
{
        ausgabe.writeln("</BLOCKQUOTE>")
        ausgabe.writeln("<font face=univers,geneva,verdana,arial size=2><P CLASS=\"Summe\">" + anz + " Eintr" + ((anz == 1) ? "ag" : "&auml;ge") + " gefunden.</P></font>")
}

// Ausgabe des Footers der Kategorienliste
function kat_footer(anz)
{
        ausgabe.writeln("<P CLASS=\"Summe\">" + anz + " Kategorie" + ((anz == 1) ? "" : "n") + " gefunden.</P>")
}

// Ausgabe des HTML-Footers des Dokuments
function html_footer()
{
        if(copyright_anzeige)
                ausgabe.writeln("<P><HR SIZE=\"1\" NOSHADE WIDTH=\"100%\"><SMALL><SMALL>Web-Nautik - Suchmaschine</SMALL></SMALL></P>")
        ausgabe.writeln("</BODY>")
        ausgabe.writeln("</HTML>")
        ausgabe.close()
}

// Sortierfunktionen
function sort_allgemein(a, b, eigenschaft, aufwaerts)
{
        var        so        = aufwaerts ? -1 : 1
        if(eintraege[a][eigenschaft] < eintraege[b][eigenschaft])
                return so
        if(eintraege[a][eigenschaft] > eintraege[b][eigenschaft])
                return -so
        return 0
}

function sort_titel(a, b)
{
        return sort_allgemein(a, b, "titel", true)
}

function sort_url(a, b)
{
        return sort_allgemein(a, b, "url", true)
}

function sort_kategorie(a, b)
{
        return sort_allgemein(a, b, "kategorie", true)
}

function sort_beschreibung(a, b)
{
        return sort_allgemein(a, b, "beschreibung", true)
}

function sort_schluesselworte(a, b)
{
        return sort_allgemein(a, b, "schluesselworte", true)
}

function sort_bewertung(a, b)
{
        return sort_allgemein(a, b, "bewertung", false)
}

function sort_zaehlung(a, b)
{
        return sort_allgemein(a, b, "fundstellen", false)
}

// Leerzeichen am Anfang und Ende einer Zeichenkette entfernen
function leerzeichen_entfernen(s)
{
        var        leerzeichen        = " \b\f\n\r\t"

        // Leerzeichen am Anfang entfernen
        var        start        = 0
        var        found
        found        = leerzeichen.indexOf(s.substr(start, 1))
        while((found >= 0) && (start < s.length))
        {
                start++
                found        = leerzeichen.indexOf(s.substr(start, 1))
        }
        if(start == s.length)
                return ""
        s        = s.substring(start)

        // Leerzeichen am Ende entfernen
        start        = s.length - 1
        found        = leerzeichen.indexOf(s.substr(start, 1))
        while((found >= 0) && (start > 0))
        {
                start--
                found        = leerzeichen.indexOf(s.substr(start, 1))
        }
        s        = s.substring(0, start + 1)

        return s
}

// Eintrag in Eintragsliste
function makeeintrag(URL, Titel, Kategorie, Beschreibung, Schluesselworte)
{
        this.url                        = URL
        this.titel                        = Titel
        this.kategorie                        = Kategorie
        this.beschreibung                = Beschreibung
        this.schluesselworte                = Schluesselworte
        this.fundstellen                = null
        this.bewertung                        = null
        this.fundstellen_prozent        = null
        this.bewertung_prozent                = null
}

// --- Funktion fuer externe Nutzung ---

// === Suchen ===

// Suchfunktion fuer Suchformular
function Suchen()
{
        status        = "Suche l\xE4uft..."
        // Formularauswertung
        query                        = eingabe.Suchformular.Suchtext.value
        if(eingabe.Suchformular.Kompaktformular.value == "j")
        {
                und_verknuepfung        = (eingabe.Suchformular.Verknuepfung.value == "u") ? true : false
                sortierung                = eingabe.Suchformular.Sortierung.value
                gross_klein                = (eingabe.Suchformular.Grossbuchstaben.value == "j") ? true : false
                suchwortzaehlung        = (eingabe.Suchformular.Zaehlung.value == "j") ? true : false
                kompakt                        = (eingabe.Suchformular.Kompakt.value == "j") ? true : false
                suche_titel                = (eingabe.Suchformular.BereichTitel.value == "j") ? true : false
                suche_url                = (eingabe.Suchformular.BereichURL.value == "j") ? true : false
                suche_kategorie                = (eingabe.Suchformular.BereichKategorie.value == "j") ? true : false
                suche_beschreibung        = (eingabe.Suchformular.BereichBeschreibung.value == "j") ? true : false
                suche_schluesselworte        = (eingabe.Suchformular.BereichSchluesselworte.value == "j") ? true : false
        }
        else
        {
                und_verknuepfung        = eingabe.Suchformular.Verknuepfung[(eingabe.Suchformular.Verknuepfung[0].value == "u") ? 0 : 1].checked
                sortierung                = eingabe.Suchformular.Sortierung[eingabe.Suchformular.Sortierung.selectedIndex].value
                gross_klein                = eingabe.Suchformular.Grossbuchstaben.checked
                suchwortzaehlung        = eingabe.Suchformular.Zaehlung.checked
                kompakt                        = eingabe.Suchformular.Kompakt.checked
                suche_titel                = eingabe.Suchformular.BereichTitel.checked
                suche_url                = eingabe.Suchformular.BereichURL.checked
                suche_kategorie                = eingabe.Suchformular.BereichKategorie.checked
                suche_beschreibung        = eingabe.Suchformular.BereichBeschreibung.checked
                suche_schluesselworte        = eingabe.Suchformular.BereichSchluesselworte.checked
        }

        // Pruefungen
        if(!suchwortzaehlung && ((sortierung == "Z") || (sortierung == "W")))
        {
                status        = ""
                alert("Nach der Suchwortz\xE4hlung oder -bewertung kann nur sortiert werden, wenn die Z\xE4hlung aktiviert ist.")
                return
        }
        if(query == "")
        {
                status        = ""
                alert("Bitte mindestens ein Suchwort angeben! Danke!")
                return
        }
        if(!(suche_titel || suche_url || suche_kategorie || suche_beschreibung || suche_schluesselworte))
        {
                status        = ""
                alert("Bitte mindestens einen Suchbereich angeben! Danke!")
                return
        }

        // Aufbereitung
        if(!gross_klein)
                query        = query.toLowerCase()
        query        = query.split(" ")

        // Eintraege ermitteln
        max_fundstellen        = 0
        max_bewertung        = 0
        var        gefundene_eintraege        = new Array()
        var        i
        var        anz        = 0
        for(i = 0; i < eintraege.length; i++)
                if(gefunden(i))
                        gefundene_eintraege[anz++]        = i

        // Sortierung
        switch(sortierung)
        {
                case "U":
                        gefundene_eintraege.sort(sort_url)
                        break
                case "K":
                        gefundene_eintraege.sort(sort_kategorie)
                        break
                case "B":
                        gefundene_eintraege.sort(sort_beschreibung)
                        break
                case "S":
                        gefundene_eintraege.sort(sort_schluesselworte)
                        break
                case "W":
                        gefundene_eintraege.sort(sort_bewertung)
                        break
                case "Z":
                        gefundene_eintraege.sort(sort_zaehlung)
                        break
                default:
                        gefundene_eintraege.sort(sort_titel)
        }

        // Prozentwerte ermitteln
        if(suchwortzaehlung)
        {
                var        e
                for(i = 0; i < gefundene_eintraege.length; i++)
                {
                        e        = gefundene_eintraege[i]
                        eintraege[e].fundstellen_prozent        = Math.round((eintraege[e].fundstellen * 100) / max_fundstellen)
                        eintraege[e].bewertung_prozent                = Math.round((eintraege[e].bewertung * 100) / max_bewertung)
                }
        }

        // Ausgabe
        html_header()
        erg_header()

        if(anz == 0)
                ausgabe.write("<FONT FACE=univers,geneva,verdana,arial SIZE=2><P>Keine Eintr&auml;ge gefunden.</P></font>")
        else
                for(i = 0; i < gefundene_eintraege.length; i++)
                        ausgabe_eintrag(gefundene_eintraege[i])

        erg_footer(anz)
        html_footer()

        status        = ""
}

// === Kategorienliste/Katalog ===

// Kategorien auflisten/Katalog
function Katalog()
{
        var        i
        var        j
        var        ls
        var        liste        = new Array()

        // Kategorien ermitteln
        for(i = 0; i < eintraege.length; i++)
        {
                if(eintraege[i].kategorie != "")
                {
                        ls        = eintraege[i].kategorie.split(",")
                        for(j = 0; j < ls.length; j++)
                                ls[j]        = leerzeichen_entfernen(ls[j])
                        liste        = liste.concat(ls)
                }
        }
        liste.sort()

        // Ausgabe Header
        var        aktuelle_kategorie
        var        anz        = 0

        html_header()
        kat_header()

        // Kategorienliste durchgehen, Eintraege ausgeben
        for(i = 0; i < liste.length; i++)
        {
                // Pruefung, ob Kategorie mehrfach vorkommt
                if(i == 0)
                        aktuelle_kategorie        = liste[0]
                else
                {
                        if(liste[i] == aktuelle_kategorie)
                                continue
                        else
                                aktuelle_kategorie        = liste[i]
                }
                anz++

                // Kategorie ausgeben
                ausgabe_kategorie_titel(liste[i])

                // Eintraege zur Kategorie ermitteln
                var        adressen         = new Array()
                var        cnt        = 0

                for(j = 0; j < eintraege.length; j++)
                {
                        if(eintraege[j].kategorie.indexOf(liste[i]) != -1)
                                adressen[cnt++]        = j
                }

                adressen.sort(sort_titel)

                // Gefundene Eintraege ausgeben
                for(j = 0; j < cnt; j++)
                        ausgabe_kategorie_eintrag(adressen[j])
        }

        // Ausgabe Footer
        kat_footer(anz)
        html_footer()
}

// === Eintrag vornehmen, Liste aufbauen ===

// Eintrag eintragen
function Eintrag(URL, Titel, Kategorie, Beschreibung, Schluesselworte)
{
        eintraege[anzahl_eintraege++]        = new makeeintrag(URL, Titel, Kategorie, Beschreibung, Schluesselworte)
}

// EOF
