/****************************
 *
 * Allgemeine Funktionen
 *
 ****************************/
//ob wir in der deutschen Sprachseite sind, oder nicht
var isNotGerman = false;

//url, auf die die Ajax Requests geschickt werden
var gdaAjaxUrl = null;

//Markiert ein Element als nicht Fehlerhaft
function markLabelOk( clazzSelector ) {
	//$( "label[class*=" + clazzSelector + "]" ).removeClass( "error" );
	$( "." + clazzSelector ).removeClass("error");
}

//Markiert ein Element als Fehlerhaft
function markLabelErroneous( clazzSelector ) {
	//$( "label[class*=" + clazzSelector + "]" ).addClass( "error" );
	if (clazzSelector != '') $( "." + clazzSelector ).addClass("error");
}

//Selektiert in Formular formName die Option von elementName mit dem angegebenen value
function selectOption( formName, elementName, value ) {
	var myForm = document.forms[formName];
	var element = myForm.elements[ elementName ];
	for( var i = 0; i < element.options.length; i++ ) {
		var option = element.options[ i ];
		if ( option.value == value ) {
			option.selected = true;
		} else {
			option.selected = false;
		}
	}
}

//Entfernt alle optionen aus dem uebergebenen element
function removeOptions( element ) {
	element.empty( );
}

function setGdaisNotGerman( value ) {
	isNotGerman = value;
}

function setGdaAjaxUrl( url ) {
	gdaAjaxUrl = url;
}

/****************************
 *
 * GDA Rechner funktionen
 *
 ****************************/

//Matrix fuer alle GDA Werte
var gdaValues = new Array();
//Maennlich
gdaValues[ "m" ] = new Array();
gdaValues[ "m" ][ "15-18" ] = new Array();
gdaValues[ "m" ][ "15-18" ][ "1.4" ] = "2500";
gdaValues[ "m" ][ "15-18" ][ "1.6" ] = "2900";
gdaValues[ "m" ][ "15-18" ][ "1.8" ] = "3300";
gdaValues[ "m" ][ "15-18" ][ "2.0" ] = "3600";
gdaValues[ "m" ][ "19-24" ] = new Array();
gdaValues[ "m" ][ "19-24" ][ "1.4" ] = "2500";
gdaValues[ "m" ][ "19-24" ][ "1.6" ] = "2900";
gdaValues[ "m" ][ "19-24" ][ "1.8" ] = "3300";
gdaValues[ "m" ][ "19-24" ][ "2.0" ] = "3600";
gdaValues[ "m" ][ "25-50" ] = new Array();
gdaValues[ "m" ][ "25-50" ][ "1.4" ] = "2400";
gdaValues[ "m" ][ "25-50" ][ "1.6" ] = "2800";
gdaValues[ "m" ][ "25-50" ][ "1.8" ] = "3100";
gdaValues[ "m" ][ "25-50" ][ "2.0" ] = "3500";
gdaValues[ "m" ][ "51-64" ] = new Array();
gdaValues[ "m" ][ "51-64" ][ "1.4" ] = "2200";
gdaValues[ "m" ][ "51-64" ][ "1.6" ] = "2500";
gdaValues[ "m" ][ "51-64" ][ "1.8" ] = "2800";
gdaValues[ "m" ][ "51-64" ][ "2.0" ] = "3200";
gdaValues[ "m" ][ "65" ] = new Array();
gdaValues[ "m" ][ "65" ][ "1.4" ] = "2000";
gdaValues[ "m" ][ "65" ][ "1.6" ] = "2300";
gdaValues[ "m" ][ "65" ][ "1.8" ] = "2500";
gdaValues[ "m" ][ "65" ][ "2.0" ] = "2800";

//Weiblich
gdaValues[ "w" ] = new Array();
gdaValues[ "w" ][ "15-18" ] = new Array();
gdaValues[ "w" ][ "15-18" ][ "1.4" ] = "2000";
gdaValues[ "w" ][ "15-18" ][ "1.6" ] = "2300";
gdaValues[ "w" ][ "15-18" ][ "1.8" ] = "2600";
gdaValues[ "w" ][ "15-18" ][ "2.0" ] = "2900";
gdaValues[ "w" ][ "19-24" ] = new Array();
gdaValues[ "w" ][ "19-24" ][ "1.4" ] = "1900";
gdaValues[ "w" ][ "19-24" ][ "1.6" ] = "2200";
gdaValues[ "w" ][ "19-24" ][ "1.8" ] = "2500";
gdaValues[ "w" ][ "19-24" ][ "2.0" ] = "2800";
gdaValues[ "w" ][ "25-50" ] = new Array();
gdaValues[ "w" ][ "25-50" ][ "1.4" ] = "1900";
gdaValues[ "w" ][ "25-50" ][ "1.6" ] = "2100";
gdaValues[ "w" ][ "25-50" ][ "1.8" ] = "2400";
gdaValues[ "w" ][ "25-50" ][ "2.0" ] = "2700";
gdaValues[ "w" ][ "51-64" ] = new Array();
gdaValues[ "w" ][ "51-64" ][ "1.4" ] = "1800";
gdaValues[ "w" ][ "51-64" ][ "1.6" ] = "2000";
gdaValues[ "w" ][ "51-64" ][ "1.8" ] = "2300";
gdaValues[ "w" ][ "51-64" ][ "2.0" ] = "2500";
gdaValues[ "w" ][ "65" ] = new Array();
gdaValues[ "w" ][ "65" ][ "1.4" ] = "1600";
gdaValues[ "w" ][ "65" ][ "1.6" ] = "1800";
gdaValues[ "w" ][ "65" ][ "1.8" ] = "2100";
gdaValues[ "w" ][ "65" ][ "2.0" ] = "2300";

//Fehlercodes ( entsprechen den css klassen der felder )
var gdaErrorCodes = new Array( "gender", "age", "pal" );
//String, welcher die Ausgabe des Kalorienbedarfs beinhaltet
var gdaResultString = null;

function setGdaResultString( s ) {
	gdaResultString = s;
}

//Liest die Werte des oberen Formulares aus
//Liefert ein Array( gender, age, pal ) zurueck
function getGDAValues() {
	var gender = null;
	var age = null;
	var pal = null;
	var myForm = document.forms["gdaForm"];
	for( var i = 0; i < myForm.elements["gender"].length; i++ ) {
		if ( myForm.elements["gender"][i].checked == true )
			gender = myForm.elements["gender"][i].value;
	}
	for( var i = 0; i < myForm.elements["age"].length; i++ ) {
		if ( myForm.elements["age"][i].checked == true )
			age = myForm.elements["age"][i].value;
	}
	for( var i = 0; i < myForm.elements["pal"].length; i++ ) {
		if ( myForm.elements["pal"][i].checked == true )
			pal = myForm.elements["pal"][i].value;
	}
	return new Array( gender, age, pal );
}

//Liefert den aktuellen Kalorienbedarf aus der Matrix oder
//Einen String mit Fehlermeldungen
function getGDAValue() {
	var values = getGDAValues();
	var gender = values[0];
	var age = values[1];
	var pal = values[2];
	var error = "";
	if ( gender == null ) {
		error += gdaErrorCodes[0] + ",";
	}
	if ( age == null ) {
		error += gdaErrorCodes[1] + ",";
	}
	if ( pal == null ) {
		error += gdaErrorCodes[2];
	}
	if ( error != "" )
		return error;
	return gdaValues[ gender ][ age ][ pal ];
}

//Berechnet den Kalorienbedarf und schreibt diesen auf die Seite
//Speichert zusaetzlich die eingegebenen Daten in der Session
function calcGDA() {
	var myForm = document.forms["gdaForm"];
	var gda = getGDAValue();
	$("#gdanodataerror").hide();
	$("#gdanogdaerror").hide();
	$("#gdanoproductserror").hide();
	for( var i = 0 ; i < gdaErrorCodes.length; i++ ) {
		markLabelOk( gdaErrorCodes[i] );
	}
	if ( isNaN( gda ) ) {
		var splitted = gda.split(",");
		for( var i = 0; i < splitted.length; i++ ) {
			markLabelErroneous( splitted[i] );
		}
		$("#gdanodataerror").show();
	} else {
		saveGDAValues();
		var text = gdaResultString;
		var x = text.indexOf('[');
		var y = text.indexOf(']');
		text = text.substring( 0, x ) + " " + gda + " " + text.substring( y + 1);
		//alert( text );
		$("#gdaresult").html( "<p>" + text + "</p>" );
		$("#gdaresult").show( );
		//alert( "GDA: " + gdaValues[ gender ][ age ][ pal ]);
	}
}

//Werte an TML schicken und in session packen
function saveGDAValues() {
	var lang = $("#currentLanguage").text();
	var values = getGDAValues()
	var str = "mode=save";
	str += "&gda_gender_" + lang + "=" + values[0];
	str += "&gda_age_" + lang + "=" + values[1];
	str += "&gda_pal_" + lang + "=" + values[2];
	$.ajax({ type: "GET",
			 url: gdaAjaxUrl,
			 dataType: "text",
			 data: str });
}

/****************************
 *
 * Produktselektor funktionen
 *
 ****************************/

//Client seitige Caches
var childrenCache = new Array();
var titleCache = new Array();
var portionableCache = new Array();
var gdaCache = new Array();
var sizeCache = new Array();

//String, welcher die Ausgabe des ProduktGDAs beinhaltet
var gdaProductsResultString = null;

function setGdaProductsResultString( s ) {
	gdaProductsResultString = s;
}

//Sucht im uebergebenen cache nach dem uebergebenen schluessel
function lookupCache( cache, key ) {
	return cache[ key ];
}

//fuegt den uebergebenen wert unter dem uebergebenen schluessel im uebergebenen cache ein
function putCache( cache, key, value ) {
	return cache[ key ] = value;
}

//Laedt die abhaengigen Werte von source in dest
//Wenn source den Wert x oder '' (Keine Auswahl) hat, wird nichts geladen
//checkPortionables und checkVisibility  siehe Funktion createOptions()
function loadCategories( source, dest, checkPortionables, checkVisibility ) {
	if ( gdaAjaxUrl == null ) return;
	var selectedValue = source.attr("value");
	if ( selectedValue == "x" || selectedValue == "" ) {
		//alert( "hau ab!");
		//removeOptions( dest )
		dest.hide( );
		return;
	}
	//alert('loadCategories()');
	loadCategories0( selectedValue, dest, checkPortionables, checkVisibility );
}

/**
 * Laedt die kindwerte abhaengig von selectedValue in dest
 * @param {Object} selectedValue
 * @param {Object} dest
 * @param {Object} checkPortionables
 * @param {Object} checkVisibility
 */
function loadCategories0( selectedValue, dest, checkPortionables, checkVisibility ) {
	var valueValue = lookupCache( childrenCache, selectedValue );
	if ( valueValue == null ) {
		valueValue = $.ajax({
			type: "GET",
			url: gdaAjaxUrl,
			dataType: "text",
			async: false,
			data: "mode=children&value=" + selectedValue }).responseText;
		valueValue = jQuery.trim( valueValue );
		//alert( "got children " + valueValue );
		if ( valueValue != "" ) {
			putCache( childrenCache, selectedValue, valueValue );
			var titleValues = loadTitles( valueValue );
			titleValues = jQuery.trim( titleValues );
			//alert( "got titles " + titleValues  );
			var portionableValues = loadPortionables( valueValue );
			portionableValues = jQuery.trim( portionableValues );
			//alert( "got portionables " + portionableValues );
			var sizeValues = loadSizes( valueValue );
			sizeValues = jQuery.trim( sizeValues );
			var splitted = valueValue.split(",");
			var splitted2 = titleValues.split("|");
			var splitted3 = portionableValues.split(",");
			var splitted4 = sizeValues.split( ";" );
			//alert( "keys = " + splitted.length + ", titles = " + splitted2.length + ", portionables = " + splitted3.length + ", sizes = " + splitted4.length );
			for( var i = 0; i < splitted.length; i++ ) {
				var key = jQuery.trim( splitted[ i ] );
				var title = jQuery.trim( splitted2[ i ] );
				title = title.replace(/\<.+?\>/g, ' ');
				var portionable = jQuery.trim( splitted3[ i ] );
				var sizeValue = jQuery.trim( splitted4[ i ] );
				//alert( "key = " + key + ", title = " + title + ", portionable = " + portionable + ", sizeValue = " + sizeValue );
				putCache( titleCache, key, title );
				putCache( portionableCache, key, portionable );
				putCache( sizeCache, key, sizeValue );
			}
		}
	}
	createOptions( dest, valueValue, checkPortionables, checkVisibility );
}

function loadTitles( valueValue ) {
	return $.ajax({ type: "GET",
			 url: gdaAjaxUrl,
			 dataType: "text",
			 async: false,
			 data: "mode=title&value=" + valueValue }).responseText
}

function loadPortionables( valueValue ) {
	return $.ajax({
				type: "GET",
				url: gdaAjaxUrl,
				dataType: "text",
				async: false,
				data: "mode=portionable&value=" + valueValue }).responseText
}

function loadSizes( valueValue ) {
	return $.ajax({
				type: "GET",
				url: gdaAjaxUrl,
				dataType: "text",
				async: false,
				data: "mode=size&value=" + valueValue }).responseText
}

/*
 * Creates new options
 * wenn checkPortionables = true ist, wird geprueft, ob ein element nicht portionierbar ist und dann ggf. ausgegraut
 * wenn checkVisibility = true ist, wird element sichtbar bzw. unsichtbar gemacht wenn werte bzw. keine werte eingetragen werden
 */
function createOptions( element, values, checkPortionables, checkVisibility ) {
	//alert( "createOptions( #" + element.attr("id") + "," + values + ")" );
	if ( checkVisibility ) {
		element.hide();
	}
	if ( values == null ) values = "";
	values = jQuery.trim( values );
	if ( values == "x" || values == "" || values.indexOf("," ) < 0 ) {
		//alert( "hau ab" );
		return;
	}
	removeOptions( element );
	var splitted = values.split(",");
	var myOptions = new Array( );
	var myOptionsText = new Array( );
	var myOptionsDisabled = new Array( );
	myOptions.push( "x" );
	myOptionsText.push( $("#defaultOption").text( ) );
	myOptionsDisabled.push( false );
	for( var i = 0; i < splitted.length; i++ ) {
		var key = jQuery.trim( splitted[ i ] );
		var textValue = lookupCache( titleCache,key );
		var optDisabled = false;
		if ( checkPortionables ) {
			var portionable = lookupCache( portionableCache, key );
			if ( portionable == 0 ) optDisabled = true;
		}
		myOptions.push( key );
		myOptionsText.push( textValue );
		myOptionsDisabled.push( optDisabled );
	}
	var myElement = document.forms[ "productsForm" ].elements[ element.attr("name") ];
	for( var i = 0; i < myOptions.length; i++ ) {
		var value = myOptions[ i ];
		var text = myOptionsText[ i ];
		var newOpt = new Option(text, value, i == 0, i == 0 );
		myElement.options[ myElement.options.length ] = newOpt;
	}
	for( var i = 0; i < myOptions.length; i++ ) {
		var disabled = myOptionsDisabled[ i ];
		if ( disabled && checkPortionables ) {
			jQuery( myElement.options[ i ] ).attr( "class", "optdisabled" );
		}
		jQuery( myElement.options[i] ).html(  myOptionsText[ i ] );
	}
	if ( checkVisibility ) {
		element.show( );
	}
	//alert( element.html() );
	//element.children( "option:first" ).attr("selected", "selected" );
	//alert( element.html() );
}

/*
 * checked, ob ein produkt nicht portionierbar ist
 */
function checkForUnportionable( element ) {
	var value = element.attr("value");
	if ( value == null || value == "x" ) {
		return;
	}
	//alert( value );
	value = lookupCache( portionableCache, value );
	//alert( value );
	if ( typeof value == 'undefined' ) {
		var key = element.attr("value");
		var titleValue = loadTitles( key );
		var portionableValue = loadPortionables( key );
		putCache( titleCache, key, titleValue );
		putCache( portionableCache, key, portionableValue );
		value = lookupCache( portionableCache, key );
		//alert( value );
	}
	$("#gdaportionerror").hide();
	if ( ( typeof value == 'undefined') || value == 0 || value == "0" ) {
		//$("#productsFormLink").hide();
		//alert( $("#gdaportionerror").text() );
		$("#gdaportionerror").show();
	}
}

//GDA fuer Produkt berechnen
function calcProductGDA() {

	$("#gdanogdaerror").hide();
	$("#gdanoproductserror").hide();
	var gda = getGDAValue();
	if ( isNaN( gda ) ) {
		var splitted = gda.split(",");
		for( var i = 0; i < splitted.length; i++ ) {
			markLabelErroneous( splitted[i] );
		}
		$("#gdanogdaerror").show();
		return;
	}
	var value = null;
	markLabelOk( "product" );
	if ( $("#level3").css( "display") != "none" ) {
		value = $("#level3").attr( "value" );
	} else if ( $("#level2").css( "display") != "none" ) {
		value = $("#level2").attr( "value" );
	} else if ( $("#level1").css( "display") != "none" ) {
		value = $("#level1").attr( "value" );
	} else if ( isNotGerman && $("#level0").css( "display") != "none" ) {
		value = $("#level0").attr("value");
	}
	if ( (value == null || value == "x")) {
		//alert( "Keine Auswahl " + value);
		$("#gdanoproductserror").show();
		markLabelErroneous( "product" );
		return;
	}
	var portionable = lookupCache( portionableCache, value );
	//alert( value + "= " + portionable );
	if ( portionable != 1 ) {
		//alert( ( portionable == 0 ) ? "Nicht portionierbar" : "Kein Produkt" );
		$("#gdaportionerror").show();
		markLabelErroneous( "product" );
		return;
	}
	var title = lookupCache( titleCache, value );
	var sizeText = lookupCache( sizeCache, value );
	if ( sizeText == null ) {
		sizeText = "";
	}
	//} else {
	//sizeText = "(= " + sizeText + ")";
	//}
	var prodgda = lookupCache( gdaCache, value );
	if ( prodgda == null ) {
		prodgda = $.ajax({
				type: "GET",
				url: gdaAjaxUrl,
				dataType: "text",
				async: false,
				data: "mode=gda&value=" + value }).responseText;
		prodgda = jQuery.trim( prodgda );
		putCache( gdaCache, value, prodgda );
	}
	saveGDAProductValues();
	var text = gdaProductsResultString;
	gda = parseInt( gda );
	prodgda = parseInt( prodgda );
	//alert( "gda=" + gda + ", prodgda=" + prodgda);
	var myGda = prodgda / ( gda / 100 );
	myGda = Math.round( myGda );
	var x1 = text.indexOf('[');
	var y1 = text.indexOf(']');
	//var x2 = text.indexOf('[', x1 + 1 );
	//var y2 = text.indexOf(']', y1 + 1);
	var x2 = text.lastIndexOf('[');
	var y2 = text.lastIndexOf(']');
	//alert( x1 + "," + y1 + " - " + x2 + ", " + y2 );
	//text = text.substring( 0, x1 ) + sizeText + text.substring( y1 + 1, x2 ) + title + text.substring( y2 + 1, x3 ) + myGda + text.substring( y3 + 1 );
	text = text.substring( 0, x1 ) + sizeText + text.substring( y1 + 1, x2 ) + myGda + text.substring( y2 + 1 );
	//alert( value );
	$("#gdaproductresult").html( "<p>" + text + "</p>" );
	$("#gdaproductresult").show();
}

//Werte an TML schicken und in session packen
function saveGDAProductValues() {
	var lang = $("#currentLanguage").text();
	var value0 = $("#level0").attr( "value" );
	var value1 = $("#level1").attr( "value" );
	var value2 = $("#level2").attr( "value" );
	var value3 = $("#level3").attr( "value" );
	var qstring = "mode=save";
	if ( value0 != null ) {
		qstring += "&gda_level0_" + lang + "=" + value0;
	}
	if ( value1 != null ) {
		qstring += "&gda_level1_" + lang + "=" + value1;
	}
	if ( value2 != null ) {
		qstring += "&gda_level2_" + lang + "=" + value2;
	}
	if ( value3 != null ) {
		qstring += "&gda_level3_" + lang + "=" + value3;
	}
	$.ajax({ type: "GET",
			 url: gdaAjaxUrl,
			 dataType: "text",
			 data: qstring });
}
