// 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, productsArray) {
	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 != "") {
			articleNumber = getArticleNumber(myElement.name);
			myArticle = productsArray[articleNumber];
			categoryNumber = myArticle.getCategoryID();
			myCategory = categoriesArray[categoryNumber];

			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, productsArray) {
	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, productsArray);
}

function getCategoryNumber (inputName) {
	alert("Error: getCategoryNumber(" + inputName + ")");
	return null;
}

function getArticleNumber (inputName) {
	if (inputName.indexOf('-') != -1) {
		var tempArray = inputName.split("-");
		return parseInt(tempArray[1]);
	} else {
		// No valid input name given
		return null;
	}
}

var bestellpositionen = new Array();

function calculateSum (productsArray, extraCharge, categoriesArray) {
	// Iterate form fields and calculate article prices and total sum
	var myForm = document.forms[0];
	var myElement;
	var someElement;
	var myAmount;
	var myCategory;
	var articleNumber;
	var myArticle;
	var mySum;
	var mySumString;
	// Gesamtbetrag
	var myTotal = 0;
	// Betrag zu 7% MwSt
	var total7 = 0;
	// Betrag zu 19% MwSt
	var total19 = 0;
	bestellpositionen = new Array();
	var oldCategoryNumber = -1;
	var extraChargesFlags = Array();
	var normaleArtikelBestellt = false;
	// Mehrwertsteuer zu 7%
	var myVAT7 = 0;
	// MwSt zu 19%
	var myVAT19 = 0;
	var product;
	var categoryNumber;

	// 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) {
			articleNumber = getArticleNumber(myElement.name);
			someElement = myForm.elements["sum-" + articleNumber];
			product = productsArray[articleNumber];
			if (product === undefined) {
				continue;
			}
			categoryNumber = product.getCategoryID();

			// 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();
					total19 += oldCategory.getExtraCharge();
					// Anfahrtskosten sind immer 19% MwSt
					myVAT19 += oldCategory.getExtraCharge() * 0.19;
					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];
					if (!isNaN(product.getPrice()) && myAmount > 0) {
						mySum = myAmount * product.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="#' + articleNumber + '">' + product.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;

					if (product.getVAT() == 7) {
						myVAT7 += mySum * 0.07;
						total7 += mySum;
					} else if (product.getVAT() == 19) {
						myVAT19 += mySum * 0.19;
						total19 += mySum;
					} else {
						// TODO Ungültiger Mehrwersteuersatz!
					}

					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;
			total19 += extraCharge;
			myForm.elements["Zzgl_Bereitstellung_des_Grillwagens"].value = formatFloat(extraCharge, "");
		} else {
			myForm.elements["Zzgl_Bereitstellung_des_Grillwagens"].value = "";
		}
		myVAT19 += extraCharge * 0.19;
//	}
	if (extraCharge && extraCharge > 0) {
		myForm.elements["wagonDummy"].value = formatFloat(extraCharge, "");
	}

	myForm.elements["totalSum"].value = formatFloat(myTotal, "");
	myForm.elements["total7"].value = formatFloat(total7, "");
	myForm.elements["total19"].value = formatFloat(total19, "");
	myForm.elements["totalVat7"].value = formatFloat(myVAT7, "");
	myForm.elements["totalVat19"].value = formatFloat(myVAT19, "");
	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, productsArray) {
	var articleNo = getArticleNumber(inputName);

	if (articleNo != null) {
		return '<input type="hidden" name="amount-' + articleNo + '" 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, total7, total19) {
	var showTotal = (normaleArtikelBestellt) ? theTotal + extraCharge : theTotal;
	var vat7 = total7 * 0.07;
	var vat19 = total19 * 0.19;
	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>');
	}
	document.write('\n              <tr>\n               <td colspan="3"><strong>Gesamtbetrag inkl. MwSt.</strong></td>\n	          <td style="text-align:right"><strong>' + formatFloat(showTotal, " €") + '</strong></td>\n              </tr>');
	document.write('\n              <tr>\n               <td colspan="3">Betrag zu 7% MwSt.</td>\n	          <td style="text-align:right">' + formatFloat(total7, " €") + '</td>\n              </tr>');
	document.write('\n              <tr>\n               <td colspan="3">Enthaltene MwSt. (7 %)</td>\n	          <td style="text-align:right">' + formatFloat(vat7, " €") + '</td>\n              </tr>');
	document.write('\n              <tr>\n               <td colspan="3">Betrag zu 19% MwSt.</td>\n	          <td style="text-align:right">' + formatFloat(total19, " €") + '</td>\n              </tr>');
	document.write('\n              <tr>\n               <td colspan="3">Enthaltene MwSt. (19 %)</td>\n	          <td style="text-align:right">' + formatFloat(vat19, " €") + '</td>\n              </tr>');
	document.write('\n             </table>');
}

var theTotal = 0.0;
var previousCategoryNo = -1;
var normaleArtikelBestellt = false;

function listOrderedFood (inputName, quantity, categoriesArray, productsArray) {
	// 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 articleNo = getArticleNumber(inputName);
	var article = productsArray[articleNo];
	if (article) {
		var categoryNo = article.getCategoryID();
		var category = categoriesArray[categoryNo];
		var articles = category.getArticleObjects();
	}
	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 (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 "";
	}
}

