var CookieGueltigkeit = 1000 * 60 * 60 * 24 * 7; // Eine Woche

function CookieHolen( bezeichner, aktDoc ) {
  var wert = "";
  if( ! aktDoc ) aktDoc = document;
  try {
		var tupelListe = aktDoc.cookie.split( ";" );
		for( var t = 0; t < tupelListe.length; t++ ) {
			var bezeichnerWert = tupelListe[t].split( "=" );
			if( bezeichnerWert && bezeichnerWert.length == 2 ) {
				var aktBezeichner = bezeichnerWert[0];
				while( aktBezeichner.charAt( 0 ) == " " ) aktBezeichner = aktBezeichner.substring( 1, aktBezeichner.length );
				if( aktBezeichner == bezeichner ) {
					return bezeichnerWert[1];
				}
			}
		}
	} catch( e ) {
		alert( "CookieHolen: (" + tupelListe + ") Fehler - " + e )
  }
  return "";
}

function CookieSetzen( bezeichner, wert, verfall, aktDoc ) {
  var jetzt = new Date( );
  var auszeit = new Date( jetzt.getTime( ) + verfall );
  if( ! aktDoc ) aktDoc = document;
  aktDoc.cookie = bezeichner + "=" + wert + "; expires=" + auszeit.toGMTString( ) + ";";
//	alert( "CookieSetzen: " + wert )
}

var AlleParameterGruppen = null; // *************************************************************************************************** //

function StatischeParameter( neuGruppenName, parameterListe, aktDoc ) {
	var namen = new Array( );
	var werte = new Array( );
	var standard = new Array( );
	var funktionen = new Array( );
	var argumente = new Array( );
	var doc = aktDoc;
	var gruppenName = neuGruppenName;

	this.GetDoc = function ( ) {
		return doc;
	}
	this.GetGruppenName = function ( ) {
		return gruppenName;
	}
	this.GetAnzahl = function( ) {
		return namen.length;
	}
	this.Index = function( suchName ) {
		for( var n = 0; n < namen.length; n++ ) {
			if( namen[n] == suchName ) return n;
		}
		return -1;
	}
	this.Get = function( parameter ) {
		var index = -1;
		if( typeof( parameter ) == "string" ) {					index = this.Index(parameter);
		} else if( typeof( parameter ) == "number" ) {	index = parameter;
		} else {
			throw( "StatischeParameter:Get: Fehler - Funktion ist für Parameter " + parameter + " (" + typeof( parameter ) +") nicht definiert!" );
		}
		if( 0 <= index && index < namen.length ) return werte[index];
		return null;
	}
	this.Set = function( parameter, wert, keineFunktionNichtSpeichern ) {
		var index = -1;
		if( typeof( parameter ) == "string" ) {					index = this.Index(parameter);
		} else if( typeof( parameter ) == "number" ) {	index = parameter;
		} else {
			throw( "StatischeParameter:Set: Fehler - Funktion ist für Parameter " + parameter + " (" + typeof( parameter ) +") nicht definiert!" );
		}
		if( 0 <= index && index < namen.length ) { 
			if( werte[index] == wert ) return null;
			werte[index] = wert; 
			if( funktionen[index] && ! keineFunktionNichtSpeichern ) funktionen[index]( namen[index], wert, argumente[index] );
		} else if( typeof( parameter ) == "string" ) {
			namen[namen.length] = parameter;
			werte[werte.length] = wert;
			funktionen[funktionen.length] = null;
			argumente[argumente.length] = null;
		}		
		if( ! keineFunktionNichtSpeichern ) speichern( );
		return wert;
	}
	this.GetStandard = function( parameter ) {
		var index = -1;
		if( typeof( parameter ) == "string" ) {					index = this.Index(parameter);
		} else if( typeof( parameter ) == "number" ) {	index = parameter;
		} else {
			throw( "StatischeParameter:GetStandard: Fehler - Funktion ist für Parameter " + parameter + " (" + typeof( parameter ) +") nicht definiert!" );
		}
		if( 0 <= index && index < namen.length ) return standard[index];
		return null;
	}
	this.SetStandard = function( parameter, neuStandard ) {
		var index = -1;
		if( typeof( parameter ) == "string" ) {					index = this.Index(parameter);
		} else if( typeof( parameter ) == "number" ) {	index = parameter;
		} else {
			throw( "StatischeParameter:SetStandard: Fehler - Funktion ist für Parameter " + parameter + " (" + typeof( parameter ) +") nicht definiert!" );
		}
		if( 0 <= index && index < namen.length ) { 
			standard[index] = neuStandard; 
		}		
		return neuStandard;
	}
	this.GetName = function( parameter ) {
		var index = -1;
		if( typeof( parameter ) == "string" ) {					index = this.Index(parameter);
		} else if( typeof( parameter ) == "number" ) {	index = parameter;
		} else {
			throw( "StatischeParameter:GetName: Fehler - Funktion ist für Parameter " + parameter + " (" + typeof( parameter ) +") nicht definiert!" );
		}
		if( 0 <= index && index < namen.length ) return namen[index];
		return null;
	}
	this.SetName = function( parameter, neuName ) {
		var index = -1;
		if( typeof( parameter ) == "string" ) {					index = this.Index(parameter);
		} else if( typeof( parameter ) == "number" ) {	index = parameter;
		} else {
			throw( "StatischeParameter:SetName: Fehler - Funktion ist für Parameter " + parameter + " (" + typeof( parameter ) +") nicht definiert!" );
		}
		if( 0 <= index && index < namen.length ) { 
			namen[index] = neuName; 
		}		
		return neuName;
	}
	this.GetFunktion = function( parameter ) {
		var index = -1;
		if( typeof( parameter ) == "string" ) {					index = this.Index(parameter);
		} else if( typeof( parameter ) == "number" ) {	index = parameter;
		} else {
			throw( "StatischeParameter:GetFunktion: Fehler - Funktion ist für Parameter " + parameter + " (" + typeof( parameter ) +") nicht definiert!" );
		}
		if( 0 <= index && index < namen.length ) return funktionen[index];
		return null;
	}
	this.SetFunktion = function( parameter, neuFunktion ) {
		var index = -1;
		if( typeof( parameter ) == "string" ) {					index = this.Index(parameter);
		} else if( typeof( parameter ) == "number" ) {	index = parameter;
		} else {
			throw( "StatischeParameter:SetFunktion: Fehler - Funktion ist für Parameter " + parameter + " (" + typeof( parameter ) +") nicht definiert!" );
		}
		if( 0 <= index && index < namen.length ) { 
			funktionen[index] = neuFunktion; 
		}		
		return neuFunktion;
	}
	this.GetArgument = function( parameter ) {
		var index = -1;
		if( typeof( parameter ) == "string" ) {					index = this.Index(parameter);
		} else if( typeof( parameter ) == "number" ) {	index = parameter;
		} else {
			throw( "StatischeParameter:GetFunktion: Fehler - Funktion ist für Parameter " + parameter + " (" + typeof( parameter ) +") nicht definiert!" );
		}
		if( 0 <= index && index < namen.length ) return argumente[index];
		return null;
	}
	this.SetArgument = function( parameter, neuArgument ) {
		var index = -1;
		if( typeof( parameter ) == "string" ) {					index = this.Index(parameter);
		} else if( typeof( parameter ) == "number" ) {	index = parameter;
		} else {
			throw( "StatischeParameter:SetArgument: Fehler - Funktion ist für Parameter " + parameter + " (" + typeof( parameter ) +") nicht definiert!" );
		}
		if( 0 <= index && index < namen.length ) { 
			argumente[index] = neuArgument; 
		}		
		return neuArgument;
	}
	this.GetHTMLText = function( ) {
		var text = "";
		for( var n = 0; n < namen.length; n++ ) {
			text += namen[n] + " = " + werte[n] + "<BR>";
		}
		return text;
	}

	var laden = function( ) {
		var cookiesText = CookieHolen( gruppenName, doc );
		var ende = false;
		do {
			var wertstart = -1;
			while( cookiesText.charAt( 0 ) == ' ' ) {
				cookiesText = cookiesText.substring( 1 );
			}
			wertstart = cookiesText.indexOf( ":" ) + 1;
			if( wertstart == -1 ) {
				ende = true;
			} else {
				var wertende = cookiesText.indexOf( "|" );
				if( wertende == -1 ) {
					wertende = cookiesText.length;
					ende = true;
				}
				aktName = cookiesText.substring( 0, wertstart - 1 );
				aktWert = cookiesText.substring( wertstart, wertende );
				for( var n = 0; n < namen.length; n++ ) {
					if( namen[n] == aktName ) {
						if( typeof( werte[n] ) == "number" ) aktWert = Number( aktWert );
						else if( typeof( werte[n] ) == "boolean" ) aktWert = ( aktWert == "true" );
						werte[n] = aktWert;
						break;	
					}
				}
				cookiesText = cookiesText.substring( wertende + 1 );
			}
		} while( ! ende );
	}
	var speichern = function( ) {
		if( AlleParameterGruppen ) {
			AlleParameterGruppen.Speichern( );
		} else {
			var cookiesText = "";
			for( var n in namen ) {
				cookiesText += namen[n] + ":" + werte[n] + "|";
			}
			CookieSetzen( gruppenName, cookiesText, CookieGueltigkeit, doc );
		}
	}	

	this.Zuruecksetzen = function( ) {
		for( var n = 0; n < namen.length; n++ ) {
			this.Set( n, standard[n] );
		}
	}
	// Konstruktor
	
	for( var p = 0; p < parameterListe.length; p += 4 ) {
		if( typeof( parameterListe[p] ) != "string" ) throw( "StatischeParameter: Fehler - Namen erwartet!" )
		if( !( typeof( parameterListe[p+2] ) == "object" || typeof( parameterListe[p+2] ) == "function" ) ) throw( "StatischeParameter: Fehler - Funktion erwartet!" )
		namen[namen.length] = parameterListe[p];
		werte[werte.length] = standard[werte.length] = parameterListe[p+1];
		funktionen[funktionen.length] = parameterListe[p+2];
		argumente[argumente.length] = parameterListe[p+3];
	}
	if( AlleParameterGruppen ) {
		AlleParameterGruppen.Hinzufuegen( this );	
	} else {
		laden( );
	}
} // ende StatischeParameter( neuName, parameterListe, aktDoc )

function StatischeParameterGruppen( parameterListe, aktDoc ) {
	var statischeParameterListe = new Array( );
	var doc = aktDoc;
	var nichtLaden = false;
			
	// Methoden
	this.Hinzufuegen = function( sp ) {
		statischeParameterListe[statischeParameterListe.length] = sp;
		if( ! nichtLaden ) this.Laden( );
	}

	this.Index = function( suchName ) {
		for( var sp = 0; sp < statischeParameterListe.length; sp++ ) {
			if( statischeParameterListe[sp].GetGruppenName( ) == suchName ) return sp;
		}
		return -1;
	}

	this.Get = function( gruppeId, wertId ) {
		var index = -1;
		if( typeof( gruppeId ) == "string" ) {				index = this.Index(gruppeId);
		} else if( typeof( gruppeId ) == "number" ) {	index = gruppeId;
		} else {
			throw( "StatischeParameterGruppen:Get: Fehler - Funktion ist für Parameter " + gruppeId + " (" + typeof( gruppeId ) +") nicht definiert!" );
		}
		if( 0 <= index && index < statischeParameterListe.length ) {
			if( wertId == null ) return statischeParameterListe[index];
			else return statischeParameterListe[index].Get( wertId );
		}
		return null;
	}

	this.Set = function( gruppeId, wertId, wert ) {
		var index = -1;
		if( typeof( gruppeId ) == "string" ) {				index = this.Index(gruppeId);
		} else if( typeof( gruppeId ) == "number" ) {	index = gruppeId;
		} else {
			throw( "StatischeParameterGruppen:Set: Fehler - Funktion ist für Parameter " + gruppeId + " (" + typeof( gruppeId ) +") nicht definiert!" );
		}
		if( 0 <= index && index < statischeParameterListe.length ) {
			statischeParameterListe[index].Set( wertId, wert );
		}
		return wert;
	}

	this.Laden = function( ) {
		var cookiesText = CookieHolen( "ParameterGruppen", doc );
		var ende = false;
		do {
			var wertstart = -1;
			while( cookiesText.charAt( 0 ) == ' ' ) {
				cookiesText = cookiesText.substring( 1 );
			}
			wertstart = cookiesText.indexOf( ":" ) + 1;
			if( wertstart == -1 ) {
				ende = true;
			} else {
				var wertende = cookiesText.indexOf( "|" );
				if( wertende == -1 ) {
					wertende = cookiesText.length;
					ende = true;
				}
				aktName = cookiesText.substring( 0, wertstart - 1 );
				if( aktName ) {
					var gruppeUndWertName = aktName.split( "." );
					if( gruppeUndWertName.length == 2 ) {
						aktWert = cookiesText.substring( wertstart, wertende );
						for( var sp = 0; sp < statischeParameterListe.length; sp++ ) {
							if( statischeParameterListe[sp].GetGruppenName( ) == gruppeUndWertName[0] ) {
								var index = statischeParameterListe[sp].Index( gruppeUndWertName[1] );
								if( index != -1 ) {
									var altWert = statischeParameterListe[sp].Get( index );
									if( typeof( altWert ) == "number" ) aktWert = Number( aktWert );
									else if( typeof( altWert ) == "boolean" ) aktWert = ( aktWert == "true" );
									statischeParameterListe[sp].Set( index, aktWert, true /*keineFunktionNichtSpeichern*/ );	
								}
								break;
							}
						}
					}
				}
				cookiesText = cookiesText.substring( wertende + 1 );
			}
		} while( ! ende );
	}

	this.Speichern = function( ) {
		var cookiesText = "";
		for( var sp = 0; sp < statischeParameterListe.length; sp++ ) {
			for( var n = 0; n < statischeParameterListe[sp].GetAnzahl( ); n++ ) {
				cookiesText += statischeParameterListe[sp].GetGruppenName( ) + "." + statischeParameterListe[sp].GetName( n ) + ":" + statischeParameterListe[sp].Get( n ) + "|";
			}
		}
		CookieSetzen( "ParameterGruppen", cookiesText, CookieGueltigkeit, doc );
	}	

	this.GetHTMLText = function( ) {
		var text = "";
		for( var sp = 0; sp < statischeParameterListe.length; sp++ ) {
			text += "Gruppe: " + statischeParameterListe[sp].GetGruppenName( ) + "<BR>";
			text += statischeParameterListe[sp].GetHTMLText( );
		}
		return text;
	}
	
	// Konstruktor
	if( AlleParameterGruppen != null ) throw( "StatischeParameterGruppen: Fehler - es darf nur eine StatischeParameterGruppen geben!" );
	AlleParameterGruppen = this;
	if( parameterListe ) {
		nichtLaden = true;
		for( var p = 0; p < parameterListe.length; p++ ) {
			var aktParameter = parameterListe[p];
			if( ! (aktParameter && aktParameter.length) || aktParameter.length < 2 ) throw( "StatischeParameterGruppen: Fehler - Array von Arrays mit mindestens zwei (Gruppenname, Parameter-Name-Wert-Array) Elementen erwartet!" );
			new StatischeParameter( aktParameter[0], aktParameter[1], aktParameter[2] );
		}
		nichtLaden = false;
		this.Laden( );
	}
	 
} // ende StatischeParameterGruppen
