// Warenkorb
// =========


// --- Parameter ---

var	cookie_warenkorb	= "Warenkorb"	// Name des Cookies fuer die Artikel
var	separator_ware		= ";"		// Trenner zwischen zwei Artikel beim Cookie
var	separator_daten		= "/"		// Trenner zwischen Artikelnummer und Anzahl beim Cookie
var	separator_feld		= "."		// Trenner fuer die Feldname
var	field_prefix		= "Warenkorb"	// Gemeinsamer Praefix fuer alle Feldnamen

var	titel_artikel_nr	= "Art.-Nr."	// Titel der Artikelnummer bei Warenkorbliste
var	titel_bezeichnung	= "CD-Bezeichnung"	// Titel der Bezeichnung bei Warenkorbliste
var	titel_preis		= "Preis"	// Titel des Preises bei Warenkorbliste
var	titel_gesamtpreis	= "G.-Preis"	// Titel des Gesamtpreises bei Warenkorbliste
var	titel_mwst		= "MwSt."	// Titel des Mehrwertsteuerprozentsatzes bei Warenkorbliste
var	titel_menge		= "Menge"	// Titel der Menge bei Warenkorbliste

// Attribute fuer die Kassen-Tabelle
var	kasse_attribute_tabelle				= "BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"2\""

// Attribute fuer die Titelzeile der Kassen-Tabelle
var	kasse_attribute_titel			= "ALIGN=\"CENTER\" VALIGN=\"MIDDLE\" BGCOLOR=\"#DDDFEC\""
var	kasse_attribute_titel_menge		= ""
var	kasse_attribute_titel_artikel_nr	= ""
var	kasse_attribute_titel_bezeichnung	= ""
var	kasse_attribute_titel_preis		= ""
var	kasse_attribute_titel_mwst		= ""
var	kasse_attribute_titel_gesamtpreis	= ""

// Attribute fuer die Artikelzeile der Kassen-Tabelle
var	kasse_attribute_zeile			= "ALIGN=\"LEFT\" VALIGN=\"MIDDLE\""
var	kasse_attribute_zeile_menge		= ""
var	kasse_attribute_eingabe_menge		= "SIZE=\"8\" MAXLENGTH=\"12\""
var	kasse_attribute_zeile_artikel_nr	= ""
var	kasse_attribute_zeile_bezeichnung	= ""
var	kasse_attribute_zeile_preis		= "ALIGN=\"RIGHT\""
var	kasse_attribute_zeile_mwst		= "ALIGN=\"RIGHT\""
var	kasse_attribute_zeile_gesamtpreis	= "ALIGN=\"RIGHT\""
var	kasse_attribute_eingabe_gesamtpreis	= "SIZE=\"8\" READONLY onChange=\"warenkorb_readonly(this)\""

// Attribute fuer die Meldungszeile der Kassen-Tabelle (bei keinem Artikel)
var	kasse_attribute_meldung				= "ALIGN=\"CENTER\" VALIGN=\"TOP\" BGCOLOR=\"#FF6666\""

// Meldungstext, falls keine Artikel vorhanden sind
var	kasse_keine_artikel	= "Keine Artikel im Warenkorb!"


// --- Variablen ---
var	produkte	= new Array()
var	fehler_gemeldet	= false
var     Mindestbestellung = true
var     GMwSt = 0
var     kein_artikel = true
var     Bestellung = ""

// --- Hilfsfunktionen ---

// Objekt Produkt anlegen
function makeProdukt(artikel_nr, bezeichnung, preis, mwst)
{
	this.artikel_nr		= artikel_nr
	this.bezeichnung	= bezeichnung
	this.preis		= preis
	this.mwst		= mwst
	this.menge		= 0
}

// Produkt dem Array hinzufuegen (extern nutzbar!)
function Produkt(artikel_nr, bezeichnung, preis, mwst)
{
	produkte[produkte.length]	= new makeProdukt(artikel_nr, bezeichnung, preis, mwst)
}

// Cookie lesen
function getCookie(cookie_name)
{
	var	cookie_array	= document.cookie.split(";")
	var	cookie_teile

	var	i
	for(i = 0; i < cookie_array.length; i++)
	{
		cookie_teile	= cookie_array[i].split("=")
		if(cookie_teile[0].substring(0, 1) == " ")
			cookie_teile[0]	= cookie_teile[0].substring(1, cookie_teile[0].length)
		if(cookie_teile[0] == cookie_name)
			return unescape(cookie_teile[1])
	}

	return ""
}

// Cookie schreiben
function setCookie(cookie_name, cookie_wert, gueltigkeitszeitraum)
{
	var	ablauf_datum	= new Date()

	ablauf_datum.setTime(ablauf_datum.getTime() + (gueltigkeitszeitraum ? gueltigkeitszeitraum : (1000 * 60 * 60)))
	document.cookie	= cookie_name + "=" + escape(cookie_wert) + "; " + "expires=" + ablauf_datum.toGMTString()
}

// Komma in Punkt umwandeln
function Komma2Punkt(s)
{
	return String(s).replace(/,/g, ".")
}

// Punkt in Komma umwandeln
function Punkt2Komma(s)
{
	return String(s).replace(/\./g, ",")
}

// Zwei Nachkommastellen
function TwoDigits(x)
{
	var	temp	= Math.round(x * 100 + .1)
	var	nach	= temp % 100
	var	vor	= (temp - nach) / 100
	return vor + "." + (nach < 10 ? "0" : "") + nach
}

// Rechts- oder Linksbuendig mit Leerzeichen auffuellen
function fuelle(s, l, li)
{
	while(s.length < l)
	{
		if(li)
			s	+= " "
		else
			s	= " " + s
	}
	return s
}

// Zeichenkette mit konstanten Zeichen
function str(c, l)
{
	var	i
	var	s	= ""
	for(i = 0; i < l; i++)
		s	+= c
	return s
}

// Menge bei einem bestimmten Artikel setzen
function setMenge(artnr, wert)
{
	var	i
	for(i = 0; i < produkte.length; i++)
		if(produkte[i].artikel_nr == artnr)
		{
			produkte[i].menge	= wert
			return
		}
}

// Produktposition im Array ermitteln
function getProdukt(artikel_nr)
{
	var	i
	for(i = 0; i < produkte.length; i++)
		if(produkte[i].artikel_nr == artikel_nr)
			return i
	return null
}

// --- Hauptfunktionen ---

// Warenkorb aus Cookie auslesen
function getWarenkorb()
{
	var	w_array	= getCookie(cookie_warenkorb).split(separator_ware)
	var	w_teile

	// Mengen auf 0 setzen
	var	i
	for(i = 0; i < produkte.length; i++)
		produkte[i].menge	= 0

	// Warenkorb leer?
	if(w_array == "" || w_array == "leer")
		return

	// Warenkorb analysieren
	var	i
	for(i = 0; i < w_array.length; i++)
	{
		w_teile	= w_array[i].split(separator_daten)
		setMenge(w_teile[0], parseFloat(w_teile[1]))
	}
}

// Warenkorb in Cookie schreiben
function setWarenkorb()
{
	var	w_cookie	= ""
	var	i

	// Alle Produkte mit Mengen ungleich 0 in String schreiben
	for(i = 0; i < produkte.length; i++)
		if(produkte[i].menge != 0)
			w_cookie	+= ((w_cookie == "") ? "" : separator_ware) + produkte[i].artikel_nr + separator_daten + produkte[i].menge

	// Cookie setzen
	setCookie(cookie_warenkorb, (w_cookie == "") ? "leer" : w_cookie)
}

// Globale Felder setzen
function globalfelder(name, set, f, e)
{
	var	i

	// Feld Warenkorb mit Artikelliste fuellen
	if(name == "Warenkorb")
	{
		var	laenge_artikel_nr	= titel_artikel_nr.length
		var	laenge_bezeichnung	= titel_bezeichnung.length
		var	laenge_preis		= titel_preis.length
		var	laenge_mwst		= titel_mwst.length
		var	laenge_menge		= titel_menge.length
		var	laenge_gesamtpreis	= titel_gesamtpreis.length
		var	temp

		// Breite der Spalten ermitteln
		for(i = 0; i < produkte.length; i++)
		{
			if(produkte[i].artikel_nr.length > laenge_artikel_nr)
				laenge_artikel_nr = produkte[i].artikel_nr.length
			if(produkte[i].bezeichnung.length > laenge_bezeichnung)
				laenge_bezeichnung = produkte[i].bezeichnung.length
			temp	= Punkt2Komma(produkte[i].menge).length
			if(temp > laenge_menge)
				laenge_menge = temp
			temp	= Punkt2Komma(TwoDigits(produkte[i].preis))
			if(temp.length > laenge_preis)
				laenge_preis = temp.length
			temp	= Punkt2Komma(produkte[i].mwst).length
			if(temp > laenge_mwst)
				laenge_mwst = temp
			temp	= Punkt2Komma(TwoDigits(produkte[i].menge * produkte[i].preis)).length
			if(temp > laenge_gesamtpreis)
				laenge_gesamtpreis = temp
		}

		// Titelzeile aufbauen
		var	s	= "\n" + fuelle(titel_menge, laenge_menge, true) + " " +
					fuelle(titel_artikel_nr, laenge_artikel_nr, true) + " " +
					fuelle(titel_bezeichnung, laenge_bezeichnung, true) + " " +
					fuelle(titel_preis, laenge_preis, false) + " " +
					fuelle(titel_mwst, laenge_mwst, false) + " " +
					fuelle(titel_gesamtpreis, laenge_gesamtpreis, false) + "\n" +
					str("-", laenge_menge) + " " +
					str("-", laenge_artikel_nr) + " " +
					str("-", laenge_bezeichnung) + " " +
					str("-", laenge_preis) + " " +
					str("-", laenge_mwst) + " " +
					str("-", laenge_gesamtpreis)

		// Artikelliste anfuegen
		for(i = 0; i < produkte.length; i++)
			if(produkte[i].menge != 0)
				s	+= "\n" + fuelle(Punkt2Komma(produkte[i].menge), laenge_menge, true) + " " +
						fuelle(produkte[i].artikel_nr, laenge_artikel_nr, true) + " " +
						fuelle(produkte[i].bezeichnung, laenge_bezeichnung, true) + " " +
						fuelle(Punkt2Komma(TwoDigits(produkte[i].preis)), laenge_preis, false) + " " +
						fuelle(Punkt2Komma(produkte[i].mwst), laenge_mwst, false) + " " +
						fuelle(Punkt2Komma(TwoDigits(produkte[i].menge * produkte[i].preis)), laenge_gesamtpreis, false)

		// Liste setzen
		document.forms[f].elements[e].value	= s
		return true
	}

	// Feld GesamtMwSt berechnen und setzen
	else if(name == "GesamtMwSt")
	{
		var	s	= 0
		for(i = 0; i < produkte.length; i++)
			s	+= produkte[i].menge * produkte[i].preis * (produkte[i].mwst / 100)
//                GMwSt = s
		document.forms[f].elements[e].value	= Punkt2Komma(TwoDigits(s))
		return true
	}

	// Feld Gesamtpreis berechnen und setzen
	else if(name == "Gesamtpreis")
	{
		var	s	= 0
		for(i = 0; i < produkte.length; i++)
			s	+= produkte[i].menge * produkte[i].preis
//                s = s + GMwSt
		document.forms[f].elements[e].value	= Punkt2Komma(TwoDigits(s))
		return true
	}

	// Feld Gesamtartikel berechnen und setzen
	else if(name == "Gesamtartikel")
	{
		var	s	= 0
		for(i = 0; i < produkte.length; i++)
			if(produkte[i].menge != 0)
				s++
		document.forms[f].elements[e].value	= s
		return true
	}

	else if(name == "GesamtEuro")
	{
		var	s	= 0
		for(i = 0; i < produkte.length; i++)
			s	+= produkte[i].menge * produkte[i].preis
                s = s / 1.95583
		document.forms[f].elements[e].value	= Punkt2Komma(TwoDigits(s))
		return true	
	}

	// Ungueltiges Feld
	return false
}

// Produktfelder fuellen
function produktfelder(name, set, f, e, allfields)
{
	// Artikelnummer von Namen trennen
	f_teile	= name.split(separator_feld)
	if(f_teile.length != 2)
	{
		if(!fehler_gemeldet)
			alert("Falsche Schreibweise: " + name + ".\nErlaubt: Artikelnummer.Bezeichner")
		fehler_gemeldet	= true
		return
	}

	// Position in Produktliste ermitteln
	var	pnr	= getProdukt(f_teile[0])
	if(pnr != null)
	{
		// Alle Felder setzen?
		if(allfields)
		{
			// Felder setzen?
			if(set)
			{
				var	gesetzt	= false
				switch(f_teile[1])
				{
					case "Menge":
						document.forms[f].elements[e].value	= Punkt2Komma(produkte[pnr].menge)
						break
					case "ArtikelNr":
						document.forms[f].elements[e].value	= produkte[pnr].artikel_nr
						gesetzt	= true
						break
					case "Bezeichnung":
						document.forms[f].elements[e].value	= produkte[pnr].bezeichnung
						gesetzt	= true
						break
					case "Preis":
						document.forms[f].elements[e].value	= Punkt2Komma(TwoDigits(produkte[pnr].preis))
						gesetzt	= true
						break
					case "MwSt":
						document.forms[f].elements[e].value	= produkte[pnr].mwst
						gesetzt	= true
						break
					case "Gesamtpreis":
						break
					default:
						if(!fehler_gemeldet)
							alert("Tippfehler: " + f_teile[1] + "\nErlaubt: Menge, ArtikelNr, Bezeichnung, Preis, MwSt, Gesamtpreis")
						fehler_gemeldet	= true
				}
				if(gesetzt)
					document.forms[f].elements[e].defaultValue	= document.forms[f].elements[e].value
			}

			// Felder auswerten?
			else
			{
				switch(f_teile[1])
				{
					case "Menge":
						var wert	= parseFloat(Komma2Punkt(document.forms[f].elements[e].value))
						if(isNaN(wert))
							wert	= 0
						produkte[pnr].menge	= wert
						break
				}
			}
		}

		// Summenfelder (nur Setzen, nicht auswerten)
		if(set)
		{
			switch(f_teile[1])
			{
				case "Gesamtpreis":
					document.forms[f].elements[e].value	= Punkt2Komma(TwoDigits(produkte[pnr].menge * produkte[pnr].preis))
					gesetzt	= true
					break
			}
			if(gesetzt)
				document.forms[f].elements[e].defaultValue	= document.forms[f].elements[e].value
		}
	}
}

// Alle Formulare und Elemente untersuchen
function scanForms(set, allfields)
{
	var	f
	for(f = 0; f < document.forms.length; f++)
	{
		var	e
		for(e = 0; e < document.forms[f].elements.length; e++)
		{
			// Gueltiger Feldname?
			if(document.forms[f].elements[e].name.substring(0, field_prefix.length + 1) == (field_prefix + separator_feld))
			{
				var	name	= document.forms[f].elements[e].name.substring(field_prefix.length + 1)
				if(!globalfelder(name, set, f, e))
					produktfelder(name, set, f, e, allfields)
			}
		}
	}
}

// --- Extern zugaengliche Funktionen ---

// Pruefung auf Veraenderung des Inhalts
function warenkorb_readonly(o)
{
	if(o.value != o.defaultValue)
		o.value	= o.defaultValue
}

// Warenkorb loeschen
function warenkorb_loeschen()
{
	var	i
	for(i = 0; i < produkte.length; i++)
		produkte[i].menge	= 0
	scanForms(true, true)
}

// Liste fuer Kasse darstellen
function warenkorb_kasse()
{
	getWarenkorb()
	var	i
	with(document)
	{
		writeln("<TABLE width='550'" + kasse_attribute_tabelle + ">")
		writeln("<TR " + kasse_attribute_titel + ">")
		writeln("<TD " + kasse_attribute_titel_menge + ">" + titel_menge + "</TD>")
		writeln("<TD " + kasse_attribute_titel_artikel_nr + ">" + titel_artikel_nr + "</TD>")
		writeln("<TD " + kasse_attribute_titel_bezeichnung + ">" + titel_bezeichnung + "</TD>")
		writeln("<TD " + kasse_attribute_titel_preis + ">" + titel_preis + "</TD>")
		writeln("<TD " + kasse_attribute_titel_mwst + ">" + titel_mwst + "</TD>")
		writeln("<TD " + kasse_attribute_titel_gesamtpreis + ">" + titel_gesamtpreis + "</TD>")
		writeln("</TR>")

		// Alle Artikel ausgeben
		var	artikel_gefunden	= false
        	var	s	= 0

		for(i = 0; i < produkte.length; i++)
		{
			if(produkte[i].menge)
			{
				artikel_gefunden	= true
				writeln("<TR " + kasse_attribute_zeile + ">")
				writeln("<TD class='acht'" + kasse_attribute_zeile_menge + "><INPUT TYPE=\"TEXT\" " + kasse_attribute_eingabe_menge + " NAME=\"Warenkorb." + produkte[i].artikel_nr + ".Menge\" VALUE=\" + Punkt2Komma(produkte[i].menge) + \" onChange=\"warenkorb_aktualisieren()\"></TD>")
				writeln("<TD " + kasse_attribute_zeile_artikel_nr + ">" + produkte[i].artikel_nr + "</TD>")
				writeln("<TD " + kasse_attribute_zeile_bezeichnung + ">" + produkte[i].bezeichnung + "</TD>")
				writeln("<TD " + kasse_attribute_zeile_preis + ">" + Punkt2Komma(TwoDigits(produkte[i].preis)) + "</TD>")
				writeln("<TD " + kasse_attribute_zeile_mwst + ">" + produkte[i].mwst + "</TD>")
				writeln("<TD class='acht'" + kasse_attribute_zeile_gesamtpreis + "><INPUT TYPE=\"TEXT\" " + kasse_attribute_eingabe_gesamtpreis + " NAME=\"Warenkorb." + produkte[i].artikel_nr + ".Gesamtpreis\" VALUE=\" + Punkt2Komma(TwoDigits(produkte[pnr].menge * produkte[pnr].preis)) + \" onChange=\"warenkorb_aktualisieren()\"></TD>")
				writeln("</TR>")
                		s	+= produkte[i].menge * produkte[i].preis
                Bestellung = Bestellung + Punkt2Komma(produkte[i].menge) + " x " + produkte[i].bezeichnung + " / "
 			}
		}
                Bestellung = Bestellung + "Gesamtpreis: " + Punkt2Komma(TwoDigits(s)) + " / "
                
                if (s < 1)
                   kein_artikel = false


		// Ersatzmeldung, falls Warenkorb leer
		if(!artikel_gefunden)
		{
				writeln("<TR " + kasse_attribute_meldung + ">")
				writeln("<TD COLSPAN=\"6\">" + kasse_keine_artikel + "</TD>")
				writeln("</TR>")
		}
		writeln("</TABLE>")
                if(!artikel_gefunden)
                 Mindestbestellung = false
	}
}

// Funktion fuer Ereignishandler onLoad (Element BODY)
function warenkorb_onload()
{
	getWarenkorb()
	scanForms(true, true)
}

// Funktion fuer Ereignishandler onUnload (Element BODY)
function warenkorb_onunload()
{
	scanForms(false, true)
	setWarenkorb()
}

// Aktualisieren aller Summenfelder
function warenkorb_aktualisieren()
{
	scanForms(false, true)
	scanForms(true, false)
}

// EOF