// Roland's Grillhaehnchen JavaScript Document

/** MouseOver functions */
function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

/**
 * Formats a float for string output. Replaces "." with "," and pads post-comma characters to two characters by filling
 * up with zeroes.
 */
function formatFloat (someFloat, appendStr) {
	if (someFloat != null) {
		var retVal = new String(someFloat);
		retVal = retVal.replace(".", ",");

		// Format decimal places
		var nachkommaDazu = retVal.split(",");
		if (nachkommaDazu[1]) {
			if (nachkommaDazu[1].length > 2) {
				// Cut off hanging over decimal places
				retVal = nachkommaDazu[0] + "," + nachkommaDazu[1].substring(0, 2);
			}
			nachkommaDazu = 2 - nachkommaDazu[1].length;
		} else {
			retVal += ","
			nachkommaDazu = 2;
		}

		for (var i = 0; i < nachkommaDazu; i++) {
			retVal += "0";
		}

		return retVal + appendStr;
	} else {
		// Null parameter given
		return "";
	}
}

/**
 * Returns the given string with the character at the given index removed.
 */
function removeCharacterAt (someStr, charPos) {
	var maxIndex = someStr.length - 1;
	if (charPos < 0 || charPos > maxIndex) {
		return someStr;
	}
	// Remove character at the given position
	if (charPos == maxIndex) {
		// Strip the last character only
		return someStr.substring(0, charPos);
	} else {
		return someStr.substring(0, charPos) + someStr.substring(charPos + 1, maxIndex);
	}
}

function arrayContains (ary, test) {
	for (var i = 0; i < ary.length; i++) {
		if (ary[i]==test) {
			return true;
		}
	}
	return false;
}

/**
 * Validates the value of the given input field. If any non-numerical character is found,
 * it is removed and an alert is displayed.
 */
function validateEntry (someInput) {
	var t = someInput.value;
	for (var i = 0; i < t.length; i++) {
		if (t.charAt(i) < '0' || t.charAt(i) > '9') {
			// Invalid, non-numerical character found
			alert("Bitte geben Sie nur Ziffern ein.");
			someInput.value = removeCharacterAt(t, i);
		}
	}
}

/**
 * Überprüft ob sich eine Bestellung über die geforderte Mindestmenge beläuft.
 * Gibt eine entsprechende Meldung aus, falls dies nicht der Fall ist.
 */
function checkTotalQuantity (minQuantity, categoriesArray) {
	var myElements = document.partyservice.elements;
	var myQuantity = 0;
	var categoryTotals = new Array();
	var myCategory;
	var myArticle;

	for (var i = 0; i < myElements.length; i++) {
		myElement = myElements[i];
		if (myElement.name.indexOf('amount') == 0 && myElement.value != "") {
			categoryNumber = getCategoryNumber(myElement.name);
			articleNumber = getArticleNumber(myElement.name);
			myCategory = categoriesArray[categoryNumber];
			myArticle = myCategory.getArticleObject(articleNumber);

			myAmount = parseInt(myElement.value, 10);
			if (!isNaN(myAmount) && myArticle.getIsPortion()) {
				// Found valid amount
				myQuantity += myAmount;
				if (myCategory.getExtraCharge() > 0) {
					// Mindestumsatz für Subunternehmer nachhalten
					if (isNaN(categoryTotals[categoryNumber])) {
						categoryTotals[categoryNumber] = (myAmount * myArticle.getPrice());
					} else {
						categoryTotals[categoryNumber] += (myAmount * myArticle.getPrice());
					}
				}
			}
		}
	}

	if (myQuantity >= minQuantity) {
		// Mindestumsatz der Subunternehmer überprüfen
		for (var i = 0; i < categoryTotals.length; i++) {
			if (!isNaN(categoryTotals[i])) {
				myCategory = categoriesArray[i];;
				if (categoryTotals[i] < 400) {
					alert("Der Mindestumsatz unserer Partner beträgt 400 Euro. Bitte überprüfen Sie Ihre Bestellung diesbezüglich.");
					return false;
				}
			}
		}
		return true;
	} else {
		alert("Bitte bestellen Sie mindestens " + minQuantity + " Portion(en). Ihre Bestellung beläuft sich im Moment über " + myQuantity + " Portion(en).");
		return false;
	}
}

/**
 * Überprüft eine Bestellung auf den geforderten Mindestbestellwert und die geforderte Mindestmenge.
 * 
 * @param minQuantity
 * @param categoriesArray
 * @param minOrderValue
 * @param actualOrderValue
 * @return
 */
function checkMinimumOrderValue(minQuantity, categoriesArray, minOrderValue, actualOrderValue) {
	var val = parseFloat(actualOrderValue);
	if (val < minOrderValue) {
		alert("Ihre Bestellung überschreitet leider nicht den Mindestbestellwert von 500 Euro. Sie beläuft sich aktuell über " + actualOrderValue + " Euro.");
		return false;
	}
	return checkTotalQuantity(minQuantity, categoriesArray);
}

/**
 * Prints an HTML listing of all categories and the articles they contain.
 */
function printArticleListing (categoriesArray, extraCharge, showExtraChargeLine) {
	if (categoriesArray == standardCategoriesArray) {
		categoriesArrayName = "standardCategoriesArray";
	} else if (categoriesArray == hugeCategoriesArray) {
		categoriesArrayName = "hugeCategoriesArray";
	} else {
		categoriesArrayName = "vielePortionenArray";
	}
	// HTML template strings
	var htmlHeader = '<table width="440" border="0" cellspacing="6" cellpadding="0" class="bestellTabelle">\n              <tr>\n               <td class="rolandsGrueneUeberschrift">Portionen</td>\n               <td>&nbsp;</td>\n               <td class="rolandsGrueneUeberschrift" width="60" style="text-align:right">Preis</td>\n               <td class="rolandsGrueneUeberschrift" width="80">Gesamt</td>\n              </tr>';

	var htmlFooter = (showExtraChargeLine) ? '\n              <tr>\n               <td colspan="3">Zzgl. Bereitstellung des Grillwagens (inkl. Personal)</td>\n	          <td><input type="text" name="wagonDummy" disabled="disabled" size="6" class="textEingabeInaktiv" style="text-align:right" value="' + formatFloat(extraCharge, "") + '"></td>\n              </tr>' : '';
	htmlFooter += '\n              <tr>\n               <td colspan="3">Gesamtbetrag inkl. MwSt.</td>\n	          <td><input type="text" name="totalSum" id="totalSum" disabled="disabled" size="6" class="textEingabeInaktiv" style="text-align:right"></td>\n              </tr>\n             <tr>\n               <td colspan="3">Enthaltene MwSt. (7 %)</td>\n	          <td><input type="text" name="totalVat" id="totalVat" disabled="disabled" size="6" class="textEingabeInaktiv" style="text-align:right"></td>\n              </tr>\n             </table>';


	var whiteLineHtml = '\n              <tr>\n               <td class="weisserHintergrund" colspan="4"><img src="img/transparent.gif" width="1" height="1"></td>\n              </tr>';

	var categoryHeaderHtml = whiteLineHtml + '\n              <tr>\n               <td>&nbsp;</td>\n               <td colspan="2"><b>[[categoryName]]</b></td>\n               <td>&nbsp;</td>\n              </tr>';
	var categoryHeaderHtmlMarked = whiteLineHtml + '\n              <tr>\n               <td class="subunternehmerKopfLinks">&nbsp;</td>\n               <td colspan="2" class="subunternehmerKopfMitte"><b>[[categoryName]]</b></td>\n               <td class="subunternehmerKopfRechts">&nbsp;</td>\n              </tr>';

	var categoryFooterHtml = '\n              <tr>\n               <td colspan="4">&nbsp;</td>\n              </tr>';
	var categoryFooterHtmlMarked = '\n              <tr>\n               <td colspan="4" class="subunternehmerFuss">&nbsp;</td>\n              </tr>';

	var categoryExtraChargeHtml = '\n              <tr>\n               <td valign="top" class="subunternehmerArtikelLinks">&nbsp;</td>\n               <td valign="top" class="rolandsRoterText">Zzgl. Personal und Fahrzeug</td>\n               <td valign="top" align="right" style="text-align:right"><nobr>[[extraCharge]]</nobr></td>\n               <td valign="top" class="subunternehmerArtikelRechts"><input type="text" name="extraCharge-[[categoryNo]]" id="extraCharge-[[categoryNo]]" disabled="disabled" size="6" class="textEingabeInaktiv" style="text-align:right"></td>\n              </tr>';

	var articleHtml = '\n              <tr>\n               <td valign="top"><input type="text" name="amount-[[categoryNo]]-[[articleNo]]" size="4" maxlength="6" class="textEingabe" onkeyup="validateEntry(this);calculateSum(' + categoriesArrayName + ', ' + extraCharge + ')"></td>\n               <td valign="top"><a name="[[categoryNo]]-[[articleNo]]">[[articleName]]</a></td>\n               <td valign="top" align="right" style="text-align:right">[[articlePrice]]</td>\n               <td valign="top"><input type="text" name="sum-[[categoryNo]]-[[articleNo]]" id="sum-[[categoryNo]]-[[articleNo]]" disabled="disabled" size="6" class="textEingabeInaktiv" style="text-align:right"></td>\n              </tr>';
	var articleHtmlMarked = '\n              <tr>\n               <td valign="top" class="subunternehmerArtikelLinks"><input type="text" name="amount-[[categoryNo]]-[[articleNo]]" size="4" maxlength="6" class="textEingabe" onkeyup="validateEntry(this);calculateSum(' + categoriesArrayName + ', ' + extraCharge + ')"></td>\n               <td valign="top"><a name="[[categoryNo]]-[[articleNo]]">[[articleName]]</a></td>\n               <td valign="top" align="right" style="text-align:right">[[articlePrice]]</td>\n               <td valign="top" class="subunternehmerArtikelRechts"><input type="text" name="sum-[[categoryNo]]-[[articleNo]]" id="sum-[[categoryNo]]-[[articleNo]]" disabled="disabled" size="6" class="textEingabeInaktiv" style="text-align:right"></td>\n              </tr>';

	var hintHtml = '\n              <tr>\n               <td valign="top">&nbsp;</td>\n               <td valign="top" colspan="3">[[hintText]]</td>\n              </tr>';

	// Variable declaration
	var category;
	var article;
	var articles;
	var myArticleHtml;
	var myCategoryHtml;
	var isSubContractor;

	document.write(htmlHeader);
	// Print all categories
	for (var i = 0; i < categoriesArray.length; i++) {
		category = categoriesArray[i];
		isSubContractor = (category.getExtraCharge() > 0);
//		myCategoryHtml = categoryHeaderHtml.replace("[[categoryName]]", category.getName());
		if (isSubContractor) {
			myCategoryHtml = categoryHeaderHtmlMarked.replace("[[categoryName]]", category.getName());
		} else {
			myCategoryHtml = categoryHeaderHtml.replace("[[categoryName]]", category.getName());
		}
		document.write(myCategoryHtml);

		// Print all articles of a category
		articles = category.getArticleObjects();
		for (var j = 0; j < articles.length; j++) {
			article = articles[j];

			if (article instanceof ArticleObject) {
				if (isSubContractor) {
					myArticleHtml = articleHtmlMarked.replace(/\[\[articleName\]\]/g, article.getName());
				} else {
					myArticleHtml = articleHtml.replace(/\[\[articleName\]\]/g, article.getName());
				}
				myArticleHtml = myArticleHtml.replace(/\[\[categoryNo\]\]/g, i);
				myArticleHtml = myArticleHtml.replace(/\[\[articleNo\]\]/g, j);

				if (isNaN(article.getPrice())) {
					var articlePrice = article.getPrice();
				} else {
					var articlePrice = formatFloat(article.getPrice(), " €");
				}
				myArticleHtml = myArticleHtml.replace(/\[\[articlePrice\]\]/g, articlePrice);
				document.write(myArticleHtml);
			} else if (article instanceof HintObject) {
				myArticleHtml = hintHtml.replace(/\[\[hintText\]\]/g, article.getText());
				document.write(myArticleHtml);
			}
		}
		if (category.getExtraCharge() > 0) {
			var extraChargeHtml = categoryExtraChargeHtml.replace(/\[\[extraCharge\]\]/g, formatFloat(category.getExtraCharge(), " &euro;"));
			extraChargeHtml = extraChargeHtml.replace(/\[\[categoryNo\]\]/g, i);
			document.write(extraChargeHtml);
		}
		if (isSubContractor) {
			document.write(categoryFooterHtmlMarked);
		} else {
			document.write(categoryFooterHtml);
		}
	}
	document.write(whiteLineHtml);
	document.write(htmlFooter);
}

function getCategoryNumber (inputName) {
	if (inputName.indexOf('-') != -1) {
		var tempArray = inputName.split("-");
		return tempArray[1];
	} else {
		// No valid input name given
		return null;
	}
}

function getArticleNumber (inputName) {
	if (inputName.indexOf('-') != -1) {
		var tempArray = inputName.split("-");
		return tempArray[2];
	} else {
		// No valid input name given
		return null;
	}
}

var bestellpositionen = new Array();

function calculateSum (categoriesArray, extraCharge) {
	// Iterate form fields and calculate article prices and total sum
	var myForm = document.forms[0];
	var myElement;
	var someElement;
	var myAmount;
	var categoryNumber;
	var myCategory;
	var articleNumber;
	var myArticle;
	var mySum;
	var mySumString;
	var myTotal = 0;
	bestellpositionen = new Array();
	var oldCategoryNumber = -1;
	var extraChargesFlags = Array();
	var normaleArtikelBestellt = false;

	// Calculate article sums first, therefore iterate form elements
	for (var i = 0; i < myForm.elements.length; i++) {
		myElement = myForm.elements[i];
		if (myElement.name.indexOf('amount') == 0) {
			categoryNumber = getCategoryNumber(myElement.name);
			articleNumber = getArticleNumber(myElement.name);
			someElement = myForm.elements["sum-" + categoryNumber + "-" + articleNumber];

			// Eventuell noch abschließend Zusatzkosten für Personal und Fahrzeug dazu
			if (categoryNumber != oldCategoryNumber && arrayContains(extraChargesFlags, oldCategoryNumber) && oldCategoryNumber > -1) {
				// Kategoriewechsel
				var oldCategory = categoriesArray[oldCategoryNumber];
				if (oldCategory.getExtraCharge() > 0) {
					myTotal += oldCategory.getExtraCharge();
					myForm.elements["extraCharge-" + oldCategoryNumber].value = formatFloat(oldCategory.getExtraCharge(), "");
					var bestellNo = bestellpositionen.length;
					bestellpositionen[bestellNo] = new Array("", "Zzgl. Pers. und Fahrz.", formatFloat(oldCategory.getExtraCharge(), " &euro;"));
				}
			}

			if (myElement.value == "") {
				// Reset sum field
				someElement.value = "";
			} else {
				myAmount = parseInt(myElement.value, 10);
				if (isNaN(myAmount)) {
					// Reset input fields
					myElement.value = "";
					someElement.value = "";
				} else {
					// Found valid amount
					myCategory = categoriesArray[categoryNumber];
					myArticle = myCategory.getArticleObject(articleNumber);
					if (!isNaN(myArticle.getPrice()) && myAmount > 0) {
						mySum = myAmount * myArticle.getPrice();
						// Round sum to two decimals
						var mySum = Math.round(mySum * 100) / 100;
						// Artikel der Bestellübersicht hinzufügen
						var bestellNo = bestellpositionen.length;
						bestellpositionen[bestellNo] = new Array(myAmount, '<a href="#' + categoryNumber + '-' + articleNumber + '">' + myArticle.getName() + '</a>', formatFloat(mySum, " &euro;"));
						// Merker setzen, damit später auf evtl. Zusatzkosten für Personal und Fahrzeug überpüft wird!
						if (myCategory.getExtraCharge() > 0 && !arrayContains(extraChargesFlags, categoryNumber)) {
							extraChargesFlags.push(categoryNumber);
						} else {
							// Ein "normaler" Artikel wurde bestellt: Merken, damit zum Schluss Grillwagen dazukommt!
							normaleArtikelBestellt = true;
						}
					} else {
						mySum = 0.0;
					}

					// Increment total and set form field value
					myTotal += mySum;
					someElement.value = formatFloat(mySum, "");
				}
			}
			oldCategoryNumber = categoryNumber;
		} else if (myElement.name.indexOf('extraCharge') == 0) {
			// Zusatzkosten erstmal zurücksetzen
			myElement.value = "";
		}

		// Letztes Element, somit letzte Kategorie explizit überprüfen
		if (i == myForm.elements.length - 1 && arrayContains(extraChargesFlags, oldCategoryNumber)) {
			var oldCategory = categoriesArray[oldCategoryNumber];
			if (oldCategory.getExtraCharge() > 0) {
				myTotal += oldCategory.getExtraCharge();
				myForm.elements["extraCharge-" + oldCategoryNumber].value = formatFloat(oldCategory.getExtraCharge(), "");
				var bestellNo = bestellpositionen.length;
				bestellpositionen[bestellNo] = new Array("", "Zzgl. Pers. und Fahrz.", formatFloat(oldCategory.getExtraCharge(), " &euro;"));
			}
		}
	}

	if (categoriesArray != vielePortionenArray) {
		// Set total sum finally
		if (normaleArtikelBestellt) {
			myTotal += extraCharge;
			myForm.elements["Zzgl_Bereitstellung_des_Grillwagens"].value = formatFloat(extraCharge, "");
		} else {
//			myForm.elements["wagonDummy"].value = formatFloat(0.0, "");
			myForm.elements["Zzgl_Bereitstellung_des_Grillwagens"].value = "";
		}
	}
	myForm.elements["wagonDummy"].value = formatFloat(extraCharge, "");

	myForm.elements["totalSum"].value = formatFloat(myTotal, "");
	// Calculate 7% V.A.T.
	var myVat = (myTotal * 7) / 107;
	myForm.elements["totalVat"].value = formatFloat(myVat, "");
	myForm.elements["extraCharges"].value = extraChargesFlags.toString();

	var bestellNo = bestellpositionen.length;
//	if (normaleArtikelBestellt && extraCharge > 0) {
//		bestellpositionen[bestellNo++] = new Array("", "Zzgl. Bereitstellung des Grillwagens", formatFloat(extraCharge, " &euro;"));
//	}
	bestellpositionen[bestellNo] = new Array("", "Gesamtbetrag inkl. MwSt.", formatFloat(myTotal - extraCharge, " &euro;"));
	// Bestellübersicht aktualisieren
	var floatLayer = document.getElementById('floatLayer');
	floatLayer.innerHTML = listOrderItemsToHtml(extraCharge);
}

function listOrderItemsToHtml (extraCharge) {
//	var limit = (extraCharge > 0) ? 2 : 1;
	var limit = 1;
	var retString = '<strong>Ihre Bestellung</strong>\n'
	if (bestellpositionen.length > limit) {
		retString += '<br />(Klicken, um wieder zum Produkt zu gelangen)';
		retString += '<br /><br /><table border="0" cellspacing="0" cellpadding="2" bgcolor="#BBC322" width="310">\n<tr>\n<td>Portionen</td>\n<td>&nbsp;</td>\n<td>Gesamt</td>\n</tr>\n';
		retString += '<tr>\n<td colspan="3" height="1" bgcolor="#8AA109"><img src="img/transparent.gif" width="1" height="1" /></td>\n</tr>\n';
		for(var i=0; i<bestellpositionen.length; i++) {
			retString += '<tr>\n<td valign="top" align="right">' + bestellpositionen[i][0] + '</td>\n<td valign="top">' + bestellpositionen[i][1] + '</td>\n<td valign="top" align="right" style="text-align:right"><nobr>' + bestellpositionen[i][2] + '</nobr></td>\n</tr>\n';
			if (i == bestellpositionen.length - 2) {
				retString += '<tr>\n<td colspan="3" height="1" bgcolor="#8AA109"><img src="img/transparent.gif" width="1" height="1" /></td>\n</tr>\n';
			}
		}
		return retString + '</table>'
	}
	// Es gibt noch keine Bestellpositionen
	return retString + '<p>Sie haben Ihrer Bestellung noch keine Speisen hinzugefügt.</p>';
}

function makeHiddenField (inputName, value, categoriesArray) {
	var categoryNo = getCategoryNumber(inputName);
	var articleNo = getArticleNumber(inputName);

	if (categoryNo != null && articleNo != null) {
		var myCategory = categoriesArray[categoryNo];
		var myArticle = myCategory.getArticleObject(articleNo);
		//var myArticleName = encodeURI(myArticle.getName());
		return '<input type="hidden" name="' + myArticle.getName() + '" value="' + value + '" />';
	} else if (inputName == "extraCharges") {
		var returnString = "";
		var categoryNos = value.split(",");
		for(var i=0; i<categoryNos.length; i++) {
			var category = categoriesArray[categoryNos[i]];
			returnString += '<input type="hidden" name="Zzgl. Personal und Fahrzeug (' + category.getName() + ')" value="' + category.getExtraCharge() + '" />';
			returnString += "\r\n";
		}
		return returnString;
	} else if (inputName == "Zzgl_Bereitstellung_des_Grillwagens") {
		return '<input type="hidden" name="Zzgl. Bereitstellung des Grillwagens" value="' + value + '" />\r\n';
	} else {
		return "";
	}
}

function printTableHeader () {
	document.write('<table width="539" border="0" cellspacing="6" cellpadding="0" class="bestellTabelle">\n              <tr>\n               <td class="rolandsGrueneUeberschrift">Portionen</td>\n               <td>&nbsp;</td>\n               <td class="rolandsGrueneUeberschrift">Einzelpreis</td>\n               <td class="rolandsGrueneUeberschrift" style="text-align:right">Gesamt</td>\n              </tr>');
}

function printTableFooter (extraCharge, showExtraChargeLine) {
	var showTotal = (normaleArtikelBestellt) ? theTotal + extraCharge : theTotal;
	document.write('\n              <tr>\n               <td class="weisserHintergrund" colspan="4"><img src="../img/transparent.gif" width="1" height="1"></td>\n              </tr>');
	if (showExtraChargeLine && normaleArtikelBestellt) {
		document.write('\n              <tr>\n               <td colspan="3">Zzgl. Bereitstellung des Grillwagens (inkl. Personal)</td>\n	          <td style="text-align:right">100,00 €</td>\n              </tr>');
	}
	var theVAT = formatFloat((showTotal * 7) / 107, " €");
	document.write('\n              <tr>\n               <td colspan="3">Gesamtbetrag inkl. MwSt.</td>\n	          <td style="text-align:right">' + formatFloat(showTotal, " €") + '</td>\n              </tr>              <tr>\n               <td colspan="3">Enthaltene MwSt. (7 %)</td>\n	          <td style="text-align:right">' + theVAT + '</td>\n              </tr>\n             </table>');
}

var theTotal = 0.0;
var previousCategoryNo = -1;
var normaleArtikelBestellt = false;

function listOrderedFood (inputName, quantity, categoriesArray) {
	// HTML template strings
	var articleHtml = '\n              <tr>\n               <td valign="top">[[amount]]</td>\n               <td>[[articleName]]</td>\n               <td valign="top">[[articlePrice]]</td>\n               <td valign="top" style="text-align:right">[[sum]]</td>\n              </tr>';

	var categoryExtraChargeHtml = '\n              <tr>\n               <td valign="top">&nbsp;</td>\n               <td valign="top">Zzgl. Personal und Fahrzeug</td>\n               <td valign="top" align="right" style="text-align:right">&nbsp;</td>\n               <td valign="top" style="text-align:right"><nobr>[[extraCharge]]</nobr></td>\n              </tr>';

	var categoryNo = getCategoryNumber(inputName);
	var articleNo = getArticleNumber(inputName);
	var category = categoriesArray[categoryNo];
	if (category) {
		var articles = category.getArticleObjects();
		var article = articles[articleNo];
	}
	var myArticleHtml  = "";

	if (categoryNo != previousCategoryNo && previousCategoryNo > -1) {
		// Kategorie hat gewechselt
		var previousCategory = categoriesArray[previousCategoryNo];
		if (previousCategory.getExtraCharge() > 0) {
			// Sonderkosten für Personal und Fahrzeug addieren
			myArticleHtml += categoryExtraChargeHtml.replace(/\[\[extraCharge\]\]/, formatFloat(previousCategory.getExtraCharge(), " &euro;"));
			theTotal += previousCategory.getExtraCharge();
		} else {
			normaleArtikelBestellt = true;
		}
	}
	previousCategoryNo = categoryNo;

	if (categoryNo != null && articleNo != null && article) {
		myArticleHtml += articleHtml.replace(/\[\[amount\]\]/g, quantity);
		myArticleHtml = myArticleHtml.replace(/\[\[articleName\]\]/g, article.getName());
		myArticleHtml = myArticleHtml.replace(/\[\[articlePrice\]\]/g, formatFloat(article.getPrice(), " €"));
		var thePrice = quantity * article.getPrice();
		theTotal += thePrice;
		myArticleHtml = myArticleHtml.replace(/\[\[sum\]\]/g, formatFloat(thePrice, " €"));
	}
	return myArticleHtml;
}

function listExtraCharges (inputValues, categoriesArray) {
	var categoryExtraChargeHtml = '\n              <tr>\n               <td valign="top">&nbsp;</td>\n               <td valign="top">Zzgl. Personal und Fahrzeug</td>\n               <td valign="top" align="right" style="text-align:right">&nbsp;</td>\n               <td valign="top">[[extraCharge]]</td>\n              </tr>';

	var categoryNo = getCategoryNumber(inputName);
	var category = categoriesArray[categoryNo];

	if (categoryNo != null) {
		theTotal += category.getExtraCharge();
		return categoryExtraChargeHtml.replace(/\[\[extraCharge\]\]/, category.getExtraCharge());
	} else {
		return "";
	}
}
