// ___________________________________________________________________________
//
// Allgemeine JavaScript-Funktionen fuer Suchmasken
// ___________________________________________________________________________
//
// Copyright Uwe Dierolf, UB Karlsruhe, 03.07.2002
//
// ---------------------------------------------------------------------------
//
// ACHTUNG:
// Die Funktionen "load_prefs_opts(form, group)" und "save_prefs_opts(form)"
// und der Array "fields" MUESSEN zusaetzlich definiert sein (entweder in der
// Suchmaske oder in einer zusaetzlichen JavaScript-Datei; siehe kvk-last.js
// bzw. kvk_specific.js).
//
// 20.07.2002, Oliver Kern:
//	KVK-spezifische Elemente ausgelagert
// 05.08.2002, Oliver Kern:
//	Unschoenen Bug in "generate_session()" behoben (IE kann nicht auf
//	Strings wie auf Arrays zugreifen)
// 26.08.2002, Oliver Kern:
//	Funktion "auto_fill_form()" hinzugefuegt, die die Suchfelder in der
//	Maske automatisch mit den entsprechenden Daten aus einem eventuell
//	vorhandenen Querystring ausfuellt
// 07.05.2003, Arne Alex:
//	Funktion cookie_name() dahingehend veraendert, dass anstatt dem
//	Dateinamen (ohne .html-Endung) auch der Verzeichnisname verwendet
//	werden kann. Dadurch bessere Unterstuetzung fuer index.html-Dateien.
// 08.05.2003, Arne Alex:
//	Funktion checkISBN(isbn) hinzugefuegt. Problem: Enthaelt einen
//	String in deutscher Sprache.
// 09.05.2003, Arne Alex:
//	Funktion set_focus(form) geaendert, dass beim Laden der Seite nicht
//	mehr das Formular-Element "TI" den Fokus erhaelt, sondern das
//	erste Texteingabefeld. Damit funktioniert auch der CHZK, der
//	nicht "TI", sondern "SE" unterstuetzt.
// 17.06.2003, Marcus Spiering:
//	Funktion print_checkAll(lang) hinzugefuegt. Gibt die Buttons um alle
//	oder kein Feld auszwählen in der im Parameter "lang" übergebenen Sprache
//	aus. 
// 17.06.2003, Arne Alex:
//	Auf Wunsch von Uwe, print_checkAll() abgeaendert, dass lang nicht als
//	Parameter uebergeben werden muss, sondern aus dem Formular in der
//	HTML-Datei uebernommen wird.
// 21.07.2003, Andreas Seltenreich:
//	Support fuer Domainuebergreifendes Cookie-Setzen fuer den
//	JavaScript/Cookie-Test. XXX: evtl. doch besser Redesign als zu
//	flicken?
//
// $Log$
// Revision 1.4  2005/03/17 09:52:15  andreas
// Auswahl aller Kataloge per "kataloge=alle" im Query-String
//
// Revision 1.3  2005/02/28 17:00:28  andreas
// Bug in auto_fill_form(): Vergleichoperator ist in Javascript natürlich ==
//
// Revision 1.2  2005/02/26 21:33:05  andreas
// autosubmit-Parameter für Einbindung des KVKs in www.bdsl-online.de
//
//
// ___________________________________________________________________________
//

// Name des Sitzungs-Test-Cookies/-CGI-Parameters (muss mit der
// KVK-Konfigurationsdatei uebereinstimmen) und Sitzungsnummer
sessiontestname = "kvk-session"

// Cookie-Relay-Skript in der KVK-Domain, falls die Suchmaske in einer
// anderen Domain als der KVK liegt
cookie_relay_script = "http://www.ubka.uni-karlsruhe.de/hylib-bin/kvk/cookie_relay.cgi"

// Wenn document.URL den u.a. String nicht enthaelt, wird der Testcookie
// mit dem o.a. Skript gesetzt
cookie_domain = "ubka.uni-karlsruhe.de"

// Initialisierung "onLoad". Aufruf mit der Indexnummer des Suchformulars
function init_form(index) {
	var form = document.forms[index]
	auto_load_prefs(form)
	auto_fill_form(form)
	set_focus(form)
}

// Focus setzen, und zwar auf das erste Texteingabefeld im Formular
function set_focus(form) {
	for (var i = 0; i < form.elements.length; i++) {
		if (form.elements[i].type == "text") {
			form.elements[i].focus();
			break;
		}
	}

	// vorher:
	// form.elements["TI"].focus()
}

// Einstellungen automatisch laden
function auto_load_prefs(form) {
	if (no_cats_checked(form)) load_prefs(form)
}

// Gibt zurueck, ob schon Kataloge ausgewaehlt sind
function no_cats_checked(form) {
	for (var i = 0; i < form.kataloge.length; i++)
		if (form.kataloge[i].checked) return false
	return true
}

// Einstellungen laden
function load_prefs(form) {
	var exp = new RegExp(cookie_name() + "=([^;, ]+)")
	if (exp.test(document.cookie)) var prefs = RegExp.$1
	else return

	var groups = new Array()
	groups = prefs.split("&")

	// Nicht genuegend Gruppen vorhanden -> unbekanntes Format
	if (groups.length < 2) return

	if (load_prefs_opts) load_prefs_opts(form, groups[0])
	load_prefs_cats(form, groups[1])

	set_focus(form)
}

// Katalog-Einstellungen laden
function load_prefs_cats(form, group) {
	// Dieses Umschaufeln ist notwendig, da IE im Gegensatz zu NS nicht
	// direkt auf den String wie auf einen Array zugreifen kann
	var bits = new Array()
	bits = group.split("")

	// Nicht genuegend "Bits" vorhanden -> unbekannte Daten
	if (bits.length < form.kataloge.length) return

	for (var i = 0; i < form.kataloge.length; i++)
		form.kataloge[i].checked = (bits[i] == "1")
}

// Einstellungen sichern
function save_prefs(form) {
	var expires = new Date()
	// Ein Jahr
	expires.setTime(expires.getTime() + 31536000000)
	var cookie = cookie_name() + "="
	if (save_prefs_opts) cookie += save_prefs_opts(form) + "&"
	else cookie += "&"
	cookie += save_prefs_cats(form)
	cookie += "; expires=" + expires.toGMTString()
	document.cookie = cookie
	set_focus(form)
}

// Katalog-Einstellungen sichern
function save_prefs_cats(form) {
	var cats = ""
	for (var i = 0; i < form.kataloge.length; i++)
		if (form.kataloge[i].checked) cats += "1"
		else cats += "0"
	return cats
}

// Status einer Checkbox oder Index eines Dropdowns als Zahl zurueckgeben
function read_state(form, name) {
	switch(form.elements[name].type) {
	case "checkbox":
		if (form.elements[name].checked) return "1"
		else return "0"
	case "select-one":
		return form.elements[name].selectedIndex
	default:
		return 0
	}
}

// Katalogsatz markieren
function check_set(form, name, array) {
	var state = form.elements[name].checked
	for (var i = 0; i < array.length; i++)
		check_cat(form, array[i], state)
	set_focus(form)
}

// Katalog markieren
function check_cat(form, name, state) {
	for (var i = 0; i < form.kataloge.length; i++)
		if (form.kataloge[i].value == name) form.kataloge[i].checked = state
}

// Name des Einstellungs-Cookies
// Dateiname aus der URL der Suchmaske ohne Erweiterung + "-prefs"
function cookie_name() {
	var s = "kvk-unknown";
	if (((location.pathname.search("/([^/]+)\\.[^/]*$") != -1) && (RegExp.$1 != "index")) || (location.pathname.search("/([^/]+)/[^/]*$") != -1)) {
		s = RegExp.$1;
	}       
	return s + "-prefs";

	// Alter Code von Oliver Kern war:
	var name = location.pathname.substring(location.pathname.lastIndexOf("/") + 1)
	return name.substring(0, name.lastIndexOf(".")) + "-prefs"
}

// Suchfelder loeschen
function clear_fields(form) {
	for (var i = 0; i < fields.length; i++)
		form.elements[fields[i]].value = ""
	set_focus(form)
}

// Fuer Sitzungskonzept: generiert Zufalls-Zeichenkette und schreibt
// versteckten Parameter
function generate_session() {
	// G%($F$!!! IE 5.0 generiert zwar jedesmal eine neue Sitzungsnummer,
	// sendet aber beim zweiten Abschicken trotzdem denselben versteckten
	// Parameter wie beim erstenmal -> Workaround
	if(document.all) session="X7YZ1GHU"
	else {
		session = ""
		var str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
		var chars = str.split("")
		for (var i = 0; i < 8; i++)
			session += chars[Math.round(Math.random() * 35)]
	}
	document.write("<input type=\"hidden\" name=\"" + sessiontestname + "\" value=\"" + session + "\">")
	
	if (document.URL.indexOf(cookie_domain) < 0) {
	    // alert("schreibe cookie via cookie_relay Skript")
	    print_cookie_relay_image();
	}
}

// Setzt Sitzungs-Test-Cookie. Muss "onSubmit" aufgerufen werden,
// damit auch mehrere Suchmasken parallel benutzt werden koennen
function set_session() {
	document.cookie = sessiontestname + "=" + session + "; domain=ubka.uni-karlsruhe.de; path=/"
}

// Gibt IMG-Tag auf das cookie_relay_script aus, um
// Sitzungs-Test-Cookie Domainuebergreifend zu setzen. "onSubmit"
// Aufruf scheint hier Probleme zu machen, Aufruf deshalb schon
// on_load via generate_session()
function print_cookie_relay_image() {
        document.write("<img src=\"" + cookie_relay_script + "?" + sessiontestname + "=" + session + "\">")
}

// Suchfelder der Maske automatisch mit den entsprechenden Daten aus einem
// eventuell vorhandenen Querystring ausfuellen
function auto_fill_form(form) {
	var autosubmit = 0
	var query = location.search
	if(query.indexOf("?") == 0) query = query.substring(1)
	if(!query.length) return 0
	var pairs = query.split("&")

        var catalogs=document.getElementsByName("kataloge");
	for(var i = 0; i < pairs.length; i++) {
		var pair = pairs[i].split("=");

		if (document.getElementsByName("input-charset").item(0).value.indexOf("utf-8") < 0) {
			var key = unescape(pair[0]);
			var val = unescape(pair[1]);
		} else {
			var key = decodeURI(pair[0]);
			var val = decodeURI(pair[1]);
		}

		if(key=="autosubmit")
		{
		   autosubmit = 1;
		}
		else if(key=="kataloge")
		{
		   for(var j=0;j<catalogs.length;j++)
		   {
		       if( (catalogs[j].type=="checkbox")
			   && ((catalogs[j].value==val) || (val=="alle"))) {
			   
			   catalogs[j].checked=true;
			   if (!(val=="alle")) break;
		       }
		   }
		}
		else
		{
		   for(var j = 0; j < fields.length; j++) {
			   if(key == fields[j]) {
				   form.elements[key].value = val
				   break
			   }
		   }
		}
	       
	}

	if (autosubmit)
	  for(var j=0; j<catalogs.length; j++) {
	    if(catalogs[j].checked==true) {
	      form.submit();
	      break;
	    }
	  }

	return 0
}

// Alle/Keine-Kataloge-auswaehlen-Buttons sprachabhaengig erzeugen
function print_checkAll() {
	var auswahl
	var alle
	var einzelne
	var lang = document.forms[0].lang ? document.forms[0].lang.value : "de";

	switch (lang) {

		case "en":
			auswahl="Selection";
			alle="All";
			einzelne="None";
			break;

		case "fr":
			auswahl="Choisir";
			alle="Tous";
			einzelne="Aucun";
			break;

		case "it":
			auswahl="Scelta";
			alle="Tutti";
			einzelne="Singoli";
			break;

		case "de":
		default:
			auswahl="Auswahl";
			alle="Alle";
			einzelne="Einzelne";
			break;

	}

        document.write("<font face=\"arial,helvetica\" size=\"2\" color=\"#000000\">")
	document.write(auswahl)
	document.write("</font></td>")
	document.write("<td nowrap>")
	document.write("<font face=\"arial,helvetica\" size=\"2\">")
	document.write("<input class=\"button\" type=\"button\" value=\" ",alle,"\"") 
	document.write("onClick=\"check_all(this.form, true)\" title=\"Select all catalogs\">\n")
	document.write("<input class=\"button\" type=\"button\"") 
	document.write("value=\"",einzelne,"\" onClick=\"uncheck_all(this.form, false)\" title=\"Select no catalog\"></font>")
}

// Alle Kataloge auswählen
function check_all(form_el) {
        for (var i=0; i<form_el.kataloge.length; i++)
        {
                form_el.kataloge[i].checked = true
        }
}

// Keinen Katalog auswählen
function uncheck_all(form_el) {
        for (var i=0; i<form_el.kataloge.length; i++)
        {
                form_el.kataloge[i].checked = false
        }
}

// ISBN beim Abschicken der Suchanfrage auf Gueltigkeit ueberpruefen.
// Soll dem Benutzer Tippfehler ersparen, aber trotzdem nicht die Freiheit
// nehmen, nach ungueltigen ISBNs suchen zu lassen.
function checkISBN(isbn) {
    var ungueltig = 0;

    if (isbn.length > 0) {
        var isbn_temp = isbn.replace(/\s/g, "").replace(/-/, "").replace(/-/, "").replace(/-/, "");

        if (isbn_temp.length != 10 || isbn_temp.search(/[^\dxX]/) != -1 || isbn_temp.search(/x./i) != -1) {
            ungueltig = 1;
        } else {
            for (var i = 0; i < 10; i++) {
                ungueltig += (10 - i) * isbn_temp.charAt(i).replace(/x/i, "10");
            }
            ungueltig %= 11;
        }
    }
    return !ungueltig || confirm("Die angegebene ISBN (" + isbn + ") ist ungueltig. Wollen Sie trotzdem fortfahren?");
}

