

// Lib für Realisierung Warenkorb mit Javascript
// P. Leins, Engelskirchen im Mai / Juli 2009, Version 0.1.4
//
// Funktionsweise
// 
// Mit Javascript wird ein Cookie mit Bestelldaten befüllt und immer wieder ausgelesen.
// Der Aufruf bei der Bestellung geschieht jeweils durch inWK() mit den notwendigen Parametern.
// Es muss klar sein, dass ein Warenkorb mit Jacascript nicht sicher gestaltet werden kann.
// Die Inhalte des Warenkorbs können manipuliert werden. Der Unternehmer hat also jede Bestellung
// penibel zu prüfen.
//
// Bei Start eines Fensters wir mit CookieUp() das vorhandene Cookie gelesen
// Ist keines da, wird ein leeres Cookie erzeugt.
// mit WK_klein() wird die Anzahl der Produkte im WK ausgegeben
// mit WKout() wird der Warenkorb ausgegeben
// WKout muss für jedes Projekt angepasst werden, damit der Warenkorb in die Form ausgegeben wird.
// Hier in WKout werden zwei CSS-Classes genutzt: 
// Die Zeilen mit wk-zeile und die Löschbuttons mit wk-loesch.

// Wunschliste:
//
// Prio 1
//		Cookies sind gesperrt -> Meldung
//		16.6.2009 umgesetzt; neue Funktion Cif()
//		TODO: Läuft im IE6 noch nicht 29.6.2009 OK - tut
//			
// Prio 2 
//		Erkennung, dass Javascript gesperrt -> Meldung
//		16.6.2009 umgesetzt; Code folgt im Beispielaufruf
//			siehe Bestandteil noscript; Reaktion entsprechend
//			Ihrer Applikation.
// 
// Prio 3
//		debu == 1g-Kennung, so dass man die Testausgaben ein- und ausschalten kann
//		11.7.2009 umgesetzt; aber im Debugmode braucht man history.back() statt history.go(0)
//				in CookieDown. Noch unklar warum
//
//		Größere Variabilität in Bezug auf editierbare und nichteditierbare Parameter
//
// globale Vars
//
// Achtung bei resetGlobal() aufpassen, 
// dass dort evtl. weitere globale Vars berücksichtigt werden.
		var debu = 0; // Hier auf 1, dann im Debug-Mode
		var Trennzeichen = "!";
		var Zeilen = 5;
		var Parameter = 6;
		var Modell = new Array("","","","","");
		var Bezeichnung = new Array("","","","","");
		var Preis = new Array("","","","","");
		var Farbe = new Array("","","","","");
		var Groesse = new Array("","","","","");
		var Anzahl = new Array("","","","","");
		var globtxt = "";
		
function testing()
   { // Testfunktion für die Fehlersituation im JavaScript-Komplex
	// Wenn irgendwo im Javascript fehlerhafte Zeilen sind, wird gar nichts ausgeführt, man findet den Fehler nicht. 
	// Ruft man testing() auf und die Ausgabe kommt auf den Bildschrim, dann weiß man,
	// dass zumindest das Coding soweit richtig ist.
	// Testing() wird also nur bei der Entwicklung benötigt.
		document.writeln ("Funktionsaufrufe funktionieren! CODE müsste laufen<br />");
		return(0);
   }
   
function Cif()
	{ // Es wird testweise ein Cookie gesetzt
		// Cif steht für CheckIfCookieWorks
		// tut es ok, dann wieder löschen
		// tut es nicht, dann ... Applikationsabhängig
		// Vorgehensweise lt. 
		// JavaScript, Das umfassende Handbuch von Christian Wenz
		var stest="";
		var ctest="name=CheckIfCookieWorks;";
		var rc=99;
		
		if (debu == 1) document.writeln ("CIF Start<br />");
		if (document.cookie.length > 0)
		{ // Ein Cookie ist da, also geht es, man kann mit Cookies arbeiten
			if (debu == 1) document.writeln ("Cookie schon da<br />");
			rc=0;
		}
		else
		{
			document.cookie = ctest;
			if (document.cookie.length > 0)
			{ // tut, also cookie wieder löschen
				if (debu == 1)  document.writeln ("Cookie sollte tun<br />");
				eraC("CheckIfCookieWorks");
				if (debu == 1) 
				{
					stest = document.cookie;
					stest += ":Inhalt<br />";
					document.writeln (stest);
				}
				rc=0;
			}
			else
			{ // Fehler zurückgeben
				if (debu == 1) document.writeln ("Cookie tut wohl nicht<br />");
				rc=-1;
			}
		}
		if (debu == 1) document.writeln ("CIF Ende<br />");
		return (rc);
	}			

function eraC(nameVar)
	{ // Löschen Cookie
	var jetzt = new Date();
	var verfall = new Date(jetzt.getTime() - 60000);
	var etest="name=";
	etest += nameVar + "; ";
	//etest += "expires="+ verfall.toGMTString() + ";";
	etest += "expires=Thu, 01-Jan-70 00:00:01 GMT;";
	document.writeln (etest);
	document.writeln ("<br />");
	document.cookie = etest;
	document.writeln ("Cookie sollte gelöscht sein<br />");	
	return (99);
	}
		
function CookieUp()
   { // Cookie lesen und in die globalen Felder einsortieren
		var i=0;
		var z=0;
		var p=0;
		var startp=0;
		var lv=0;
		var s_str  =  " ";
		var txt="";
		var h1="";
		var h2="";
		var rc=0;
		
		if (debu ==1) document.writeln("CookieUp Start<br/>");
		s_str = "";
		globtxt="";
		rc = GetCookieValue ("WK-Inhalt");
		if (debu == 1) document.writeln("rc aus GetCookieValue in CookieUp:",rc,"<br />");
		if (rc == 0) // Lesen Cookie iO
		{
			s_str = globtxt;
			// Testausgabe Cookieinhalt
			if (debu == 1) document.writeln("Cookieinhalt:",s_str,"END<br />");
		
			// Länge String ok? => Annahme Cookie OK
			if (s_str.length <= 8)
			{
				rc = -10;
			}
			
			// Sollte an Pos 0,1 und 2 nicht das erwartete Zeichen stehen "!"
			// dann handelt es sich wohl um den IE, der hier reinspuckt
			if ((s_str.charAt(0) != s_str.charAt(1)) || (s_str.charAt(1) != s_str.charAt(2)))
			{
				rc = -11;
			}
			
			// Pos 1 Trennzeichen
			Trennzeichen = s_str.charAt(0);
			// Zeilenanzahl darf nur einstellig sein (1 bis 9) an Pos [3]
			if (debu == 1) document.writeln("charAt4:",s_str.charAt(4),"<br />");
			if (s_str.charAt(4) != Trennzeichen)
			{
				rc = -12;
			}
			
			// Parameteranzahl darf max. 1-stellig sein (1 bis 9) an Pos [6]
			if (debu == 1) document.writeln("charAt7:",s_str.charAt(7),"<br />");
			if (s_str.charAt(7) != Trennzeichen)
			{
				rc = -13;
			}
			if (debu == 1) document.writeln("rc bisher:",rc,"<br />");
			if (rc == 0)
			{ // bisher keine Fehler erkannt
			
				// nun zerlegen des Strings
				
				// Jetzt wird die Zeilenanzahl und die Parameteranzahl gesetzt bzw.
						// ausgelesen. Direkt danach gehen die Daten los, der Zeiger 
						// startp wird auf dieses Feld gesetzt.
				h1 = s_str.charAt(3);
				Zeilen = 1 * h1;
				// es werden nur einstellige Parameteranzahlen unterstützt
				h1 = s_str.charAt(6);
				Parameter = 1 * h1;
				startp = 9;
				if (debu == 1) document.writeln("Zeilen:",Zeilen,"   Parameter:",Parameter,"<br />");			
				// Jetzt Zeile um Zeile die Daten in die globalen Variablen einsortieren
				// Bei startp beginnt die erste Bestell-Zeile
				 
				h2= Trennzeichen + Trennzeichen;
				for (z=0; z<Zeilen; z++)
					{
					for (p=0; p<Parameter; p++)
						{
						//Suchen nach nächstem Trennzeichenpaar
						lv = startp;
						h1=s_str.charAt(lv) + s_str.charAt(lv+1);
						// 4000 ist die Cookiegrenze und hier unsere Ausstiegsbedingung
						while ((lv < 4000) && h1 != h2) {
							lv++;
							h1=s_str.charAt(lv) + s_str.charAt(lv+1);
							// nur im Ausnahmefall: 
							// if (debu == 1) document.writeln ("suche trenner:", h1,"   ",h2,"<br />");
						} 
						if ( debu == 1)
						{
							ttt="Kontrolle: " + z + p + "  lv:" + lv + " startp:"+startp+"</br>";
							document.writeln (ttt);
						}
						if (lv > 3999) 
						{ // Fehlerhafte Datei
							if ( debu == 1) alert ("Fehler bei Lesen Cookie; Datenstruktur unerwartet; Überlauf; Reset Cookie");
							resetCookie();
						}
						else
						{ // Parameter gefunden
							switch (p)
								{
								case 0: 
									Modell[z]=s_str.substring(startp,lv);
									startp = lv + 2;
									break;
								case 1: 
									Bezeichnung[z]=s_str.substring(startp,lv);
									startp = lv + 2;
									break;
								case 2: Preis[z]=s_str.substring(startp,lv);
									startp = lv + 2; 
									break;
								case 3: Farbe[z]=s_str.substring(startp,lv);
									startp = lv + 2; 
									break;
								case 4: Groesse[z]=s_str.substring(startp,lv);
									startp = lv + 2; 
									break;
								case 5: Anzahl[z]=s_str.substring(startp,lv);
									startp = lv + 3; 
									break;
								default: // Fehlerfall
									alert ("Fehler bei Lesen Cookie; Datenstruktur (Parameter) unerwartet; Reset Cookie"); 
									resetCookie();
								}
						}
					} // for p
					if ( debu == 1)
					{
						txt= "Zeile:"+z+"   M:"+Modell[z]+"   B:"+Bezeichnung[z]+"   P:"+Preis[z]+"   F:"+Farbe[z]+"   G:"+Groesse[z]+"   A:"+Anzahl[z];
						document.writeln (txt,"<br />");
					}
				} // for z
			} // rc ist ok 
			else
			{ // rc gesetzt
				resetCookie();
				if ( debu ==1 ) document.writeln("PROGRAMMABLAUFFEHLER! NACH Reset Cookie. Dies dürfte nie gedruckt werden, sonst klappt Neustart nicht!<br />");
				// Cookie wird neu gefüllt, geschrieben und Neustart
			
			}	
		return (0);
		} // rc 
		else
		{ // GetCookieValue brachte schon Fehler
			resetCookie();
			if ( debu ==1 ) document.writeln("PROGRAMMABLAUFFEHLER! NACH Reset Cookie. Auch dies dürfte nie gedruckt werden, sonst klappt Neustart nicht!<br />");
				// Cookie wird neu gefüllt, geschrieben und Neustart
		}
		if (debu ==1) document.writeln("CookieUp Ende<br/>");
   }

function resetCookie()
	{ // Reset, wenn Datenstruktur nicht mit Erwartetem übereinstimmt
	// globale Datenbereiche löschen und leeres Cookie schreiben
		if (debu ==1) document.writeln("resetCookie Start<br/>");
		resetGlobal();
		CookieDown();
		if (debu ==1) document.writeln("resetCookie Ende<br/>");
	}

function resetGlobal()
	{ // globale Variablen so nullen, dass ein korrektes Cookie entstehen kann
	var i=0;
	Trennzeichen = "!";
	Zeilen = 5;
	Parameter = 6;
	if (debu ==1) document.writeln("resetGlobal Start<br/>");
	for (i=0; i < Zeilen; i++)
		{
		Modell[i]="";
		Bezeichnung[i]="";
		Preis[i]="";
		Farbe[i]="";
		Groesse[i]="";
		Anzahl[i]="";
		}
	if (debu ==1) document.writeln("resetGlobal Ende<br/>");
	}
   
function inWK(Modell1, Bezeichnung1, Preis1, Farbe1, Groesse1, Anzahl1)
	{ // neue Zeile in Warenkorb schreiben
		var txt = "";
		var i= -1;
		// ------------------Warenkorb gesperrt ---------------------------		
		alert ("31.10.2010 Bitte nutzen Sie unseren neuen Shop unter www.shop.schickstillen.de.");
		
	}
	
function delLineWK(IndexLine)
	{ // Zeile im Warenkorb löschen
	// Wir benutzen beim Aufruf wirklich den Index, also von 0 bis 4
	// Aufruf: <a class="WK_delLine" href="javascript:delLineWK('1')">Löschen</a>
		
		var i=-1;
		i = IndexLine;
				
		Modell[i]="";
		Bezeichnung[i]="";
		Preis[i]="";
		Farbe[i]="";
		Groesse[i]="";
		Anzahl[i]="";

		// Nach dem Lösch-Klick des Anwenders schreiben wir gleich das Cookie neu weg.
		// Eine Neuanzeige ist integriert.
		CookieDown();	

	}
	
function GetCookieValue(name)
	{
		var len =0;
		var p1 = 0;
		var p2 = 0;
		var rc = 0;
		var txt = "";
		
		if (debu ==1) document.writeln("GetCookieValue Start<br/>");
		txt = document.cookie;
		len = document.cookie.length;
		if (debu ==1)	document.writeln ("CookieDown Cookie zurückgelesen, nun:",txt,"<br/>");  
		if (debu ==1)	document.writeln ("CookieDown Cookie zurückgelesen, Länge:",len,"<br/>"); 
		if (len>0) // Cookie da
		{
			p1 = document.cookie.indexOf(name, 0); 
			if (p1 == -1) // Falsches Cookie
			{
			rc = -2;
			if (debu ==1) document.writeln("GetCookieValue Falsches Cookie<br/>");
			}
			else
			{
				p2 = document.cookie.indexOf("value=", 0);
				if (p2 == -1) // Inhalt nicht wie erwartet angegeben
				{
				rc = -3;
				if (debu ==1) document.writeln("GetCookieValue Inhaltsfehler<br/>");
				}
				else
				{ // 6 wegen value=
				txt = document.cookie.substring(p2+6,len);
				globtxt = txt;
				if (debu ==1) document.writeln ("CookieDown Cookie zurückgelesen, Inhalt nun:",txt,"<br/>"); 
				}
			}
		}
		else
		{
		rc = -1;
		if (debu ==1) document.writeln("GetCookieValue Kein Cookie<br/>");
		}
		if (debu ==1) document.writeln("GetCookieValue Ende<br/>");
		return (rc);		
	}
	
function CookieDown()
   { // Cookie schreiben, in V01 noch ohne Cookienamen usw.
		
		var i = 0;
		var txt = "name=WK-Inhalt, value=";
		if (debu == 1) document.writeln ("CookieDown Start<br/>");
		txt += Trennzeichen; //Kennzeichen für Trennung
		txt += Trennzeichen + Trennzeichen; // Trennung
		txt += Zeilen;  // Zeilen
		txt += Trennzeichen + Trennzeichen; // Trennung
		txt += Parameter // 3 Parameter Bestellnummer, Bez, Preis
		txt += Trennzeichen + Trennzeichen; // Trennung
		for (i=0; i<5; i ++)
		{
			txt += Modell[i]+Trennzeichen + Trennzeichen
					+Bezeichnung[i]+Trennzeichen + Trennzeichen
					+Preis[i]+Trennzeichen + Trennzeichen 
					+Farbe[i]+Trennzeichen + Trennzeichen 
					+Groesse[i]+Trennzeichen + Trennzeichen 
					+Anzahl[i]+Trennzeichen + Trennzeichen 
					+ Trennzeichen; // Zeile mit 3*Trennzeichen beenden
		}
		txt += ";"		// Endekennung Inhalt
		document.cookie = txt;
		// Testausgabe 
		if (debu == 1) 
		{
			document.writeln ("CookieDown Cookie geschrieben mit:",txt,"<br />");  
			//Kontrolle
			GetCookieValue("WK-Inhalt");
			alert ("gleich erfolgt Neustart");
		}
		// Nach dem Schreiben wird die Seite neu aufgebaut.
		// Dies muss nicht sein, aber
		// a) der Anwender sieht die Reaktion
		// b) wenn der Warenkorb angezeigt wird (oder auch nur die Anzahl)
		//       dann werden die neuen Daten gleich angezeigt.
		history.go(0);
		//stop; // diesen Ausführungszweig komplett stoppen
		// manche Browser (IE) machen sonst dennoch hier weiter.
		if (debu == 1) document.writeln ("PROGRAMMABLAUFFEHLER: Dies dürfte nie erscheinen: CookieDown Ende<br/>");
	}  
	
function WKout()
	{ // Ausgabe der Bestelldaten in Kurzform für den Warenkorb
	var z = -1;
	var h = 1;
	document.writeln ('<p id="wk-pl">Warenkorb:</p> <p id="wki-pl" >');
	for (z=0; z<Zeilen; z++)
		{
		h = z+1;
		document.write ( "<p class='wk-zeile'>" + h + ": " + Modell[z].substring(0,6) + "... " + Bezeichnung[z].substring(0,6) + "... " + Preis[z]+ "... " + Farbe[z]+ "... " + Groesse[z]+ "... " + Anzahl[z] + "</p>");
		//Löschen
		document.write ( '   ' + '<a href="javascript:delLineWK(\'' + z + '\')" class="wk-loesch">' + unescape("l%F6schen%0A") + '</a>' + '</br>' );
		}
	write ('</p>'); 
	}

function WK_klein()
	{ // Ausgabe Anzahl Elemente im Warenkorb
	var z = -1;
	var h = 0;
	
	for (z=0; z<Zeilen; z++)
		{
		if (Modell[z]) 
			{
			h++;
			}
		} 
	// Ausgabe Anzahl mit Text
	// document.write ("Anzahl Produkte im Warenkorb: "+h+"<br />" );
	
	// Ausgabe nur der Anzahl
	document.write (h);
	}
	


