// 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["RahmenSuchformular"].document
var	ausgabe	= parent.frames["RahmenErgebnisse"].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	= true
var	farbe_bgcolor		= "#FFFFFF"
var	farbe_text		= "#6D6D6D"
var	farbe_link		= "#6D6D6D"
var	farbe_alink		= "#FF7F00"
var	farbe_vlink		= "#FF7F00"
var	farbe_hover		= "#FF7F00"

// 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	= true

// 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\"><A HREF=\"" + eintraege[nr].url + "\" TARGET=\"contents\"><IMG SRC=\"neues_fenster.gif\" WIDTH=\"15\" HEIGHT=\"10\" HSPACE=\"2\" VSPACE=\"0\" BORDER=\"0\" ALT=\"Open a new window\"></A><A HREF=\"" + eintraege[nr].url + "\" TARGET=\"contents\">" + toHTML(limit(eintraege[nr].titel, limit_titel)) + "</A>")
		if(suchwortzaehlung)
		{
			if(eintraege[nr].bewertung >= 1)
				ausgabe.write(" [" + String(eintraege[nr].bewertung_prozent) + "%]")
		}
		ausgabe.writeln("</P>")
	}
	else
	{
		ausgabe.write("<P CLASS=\"Eintrag\"><img src=\"" + eintraege[nr].kategorie + "\"> <A HREF=\"" + eintraege[nr].url + "\" TARGET=\"contents\"><A HREF=\"" + eintraege[nr].url + "\" TITLE=\"" + eintraege[nr].url + "\" TARGET=\"contents\">" + toHTML(limit(eintraege[nr].titel, limit_titel)) + "</A><BR>")
		
		if(suchwortzaehlung)
		{
			if(eintraege[nr].fundstellen >= 1)
				ausgabe.write("<BR><EM>Found search texts:</EM> " + String(eintraege[nr].fundstellen) + " [" + String(eintraege[nr].fundstellen_prozent) + "%]")
			if(eintraege[nr].bewertung >= 1)
				ausgabe.write("<BR><EM>hits:</EM> " + String(eintraege[nr].bewertung) + " [" + String(eintraege[nr].bewertung_prozent) + "%]")
		}
		ausgabe.writeln("</P>")
	}
}

// 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\"><A HREF=\"" + eintraege[nr].url + "\" TARGET=\"contents\"><IMG SRC=\"neues_fenster.gif\" WIDTH=\"15\" HEIGHT=\"10\" HSPACE=\"2\" VSPACE=\"0\" BORDER=\"0\" ALT=\"Neues Fenster &ouml;ffnen\"></A><A HREF=\"" + eintraege[nr].url + "\" TITLE=\"" + eintraege[nr].url + "\" TARGET=\"contents\">" + toHTML(limit(eintraege[nr].titel, limit_titel)) + "</A><BR>")
	ausgabe.write(toHTML(limit(eintraege[nr].beschreibung, limit_beschreibung)))
	ausgabe.writeln("</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=\"Dietmar Rabich\">")
	ausgabe.writeln("<META NAME=\"PUBLISHER\" CONTENT=\"Dietmar Rabich\">")
	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("//-->")
	ausgabe.writeln("</STYLE>")
	ausgabe.writeln("<LINK REL=\"STYLESHEET\" TYPE=\"text/css\" HREF=\"style.css\">")
	ausgabe.writeln("<BASE TARGET=\"contents\">")
	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("<P CLASS=\"Titel\"><STRONG>Résultat de la recherche:</STRONG></P>")
	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("<P CLASS=\"Summe\">" + anz + " Page" + ((anz == 1) ? " trouvée" : "s trouvées") + ".</P>")
}

// 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%\"></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	= "Scanning database..."

	// 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 == "u") ? 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("Mots-clés? Parole chiavi? Keywords? Schlüsselwörter?")
		return
	}
	if(!(suche_titel || suche_url || suche_kategorie || suche_beschreibung || suche_schluesselworte))
	{
		status	= ""
		alert("Keywords?")
		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("<P><b>Aucun résultat n'a été trouvé.<br><br>Veuillez ne pas utiliser ce type de formulations:</b><br>Juicy Salif,Alessi<br>Juicy Salif; Alessi<br>Juicy Salif+Alessi<br><br><b>Propositions:</b><br>Juicy Salif Alessi<br>Presse-citron Alessi<br>Dessin industriel 1990<br>1990 Presse-citron</P>")
	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
