foodsoft/public/javascripts/ordering.js

199 lines
6.5 KiB
JavaScript
Raw Normal View History

2009-01-06 11:49:19 +01:00
// JavaScript that handles the dynamic ordering quantities on the ordering page.
//
// In a JavaScript block on the actual view, define the article data by calls to setData().
// You should also set the available group balance through setGroupBalance(amount).
//
// Call setDecimalSeparator(char) to overwrite the default character "." with a localized value.
var modified = false // indicates if anything has been clicked on this page
var groupBalance = 0; // available group money
var decimalSeparator = "."; // default decimal separator
var toleranceIsCostly = true; // default tolerance behaviour
2009-01-06 11:49:19 +01:00
// Article data arrays:
var price = new Array();
var unit = new Array(); // items per order unit
var itemTotal = new Array(); // total item price
var quantityOthers = new Array();
var toleranceOthers = new Array();
var itemsAllocated = new Array(); // how many items the group has been allocated and should definitely get
var quantityAvailable = new Array(); // stock_order. how many items are currently in stock
2009-01-06 11:49:19 +01:00
function setDecimalSeparator(character) {
decimalSeparator = character;
}
function setToleranceBehaviour(value) {
toleranceIsCostly = value;
}
2009-01-06 11:49:19 +01:00
function setGroupBalance(amount) {
groupBalance = amount;
}
function addData(itemPrice, itemUnit, itemSubtotal, itemQuantityOthers, itemToleranceOthers, allocated, available) {
2009-01-06 11:49:19 +01:00
i = price.length;
price[i] = itemPrice;
unit[i] = itemUnit;
itemTotal[i] = itemSubtotal;
quantityOthers[i] = itemQuantityOthers;
toleranceOthers[i] = itemToleranceOthers;
itemsAllocated[i] = allocated;
quantityAvailable[i] = available;
2009-01-06 11:49:19 +01:00
}
function increaseQuantity(item) {
value = Number($('q_' + item).value) + 1;
update(item, value, $('t_' + item).value);
}
function decreaseQuantity(item) {
value = Number($('q_' + item).value) - 1;
if (value >= 0) {
update(item, value, $('t_' + item).value);
}
}
function increaseTolerance(item) {
value = Number($('t_' + item).value) + 1;
update(item, $('q_' + item).value, value);
}
function decreaseTolerance(item) {
value = Number($('t_' + item).value) - 1;
if (value >= 0) {
update(item, $('q_' + item).value, value);
}
}
function update(item, quantity, tolerance) {
// set modification flag
modified = true
// update hidden input fields
$('q_' + item).value = quantity;
$('t_' + item).value = tolerance;
// calculate how many units would be ordered in total
units = calcUnits(unit[item], quantityOthers[item] + Number(quantity), toleranceOthers[item] + Number(tolerance));
if (unitCompletedFromTolerance(unit[item], quantityOthers[item] + Number(quantity), toleranceOthers[item] + Number(tolerance))) {
$('units_' + item).update('<span style="color:grey">' + String(units) + "</span>");
} else {
$('units_' + item).update(String(units));
}
// update used/unused quantity
available = Math.max(0, units * unit[item] - quantityOthers[item]);
q_used = Math.min(available, quantity);
// ensure that at least the amout of items this group has already been allocated is used
if (quantity >= itemsAllocated[item] && q_used < itemsAllocated[item]) {
q_used = itemsAllocated[item];
}
$('q_used_' + item).update(String(q_used));
$('q_unused_' + item).update(String(quantity - q_used));
$('q_total_' + item).update(String(Number(quantity) + quantityOthers[item]));
// update used/unused tolerance
if (unit[item] > 1) {
available = Math.max(0, available - q_used - toleranceOthers[item]);
t_used = Math.min(available, tolerance);
$('t_used_' + item).update(String(t_used));
$('t_unused_' + item).update(String(tolerance - t_used));
$('t_total_' + item).update(String(Number(tolerance) + toleranceOthers[item]));
}
// update total price
if(toleranceIsCostly == true) {
itemTotal[item] = price[item] * (Number(quantity) + Number(tolerance));
} else {
itemTotal[item] = price[item] * (Number(quantity));
}
2009-01-06 11:49:19 +01:00
$('price_' + item + '_display').update(asMoney(itemTotal[item]));
// update balance
updateBalance();
}
function increaseStockQuantity(item) {
value = Number($('q_' + item).value) + 1;
if (value <= quantityAvailable[item] - quantityOthers[item]) {
updateStockQuantity(item, value);
}
}
function decreaseStockQuantity(item) {
value = Number($('q_' + item).value) - 1;
if (value >= 0) {
updateStockQuantity(item, value);
}
}
function updateStockQuantity(item, quantity) {
// set modification flag
modified = true
// update hidden input fields
$('q_' + item).value = quantity;
// update used/unused quantity
available = Math.max(0, quantityAvailable[item] - quantityOthers[item]);
q_used = Math.min(available, quantity);
// ensure that at least the amout of items this group has already been allocated is used
if (quantity >= itemsAllocated[item] && q_used < itemsAllocated[item]) {
q_used = itemsAllocated[item];
}
$('q_used_' + item).update(String(q_used));
$('q_total_' + item).update(String(Number(quantity) + quantityOthers[item]));
// update total price
itemTotal[item] = price[item] * (Number(quantity));
$('price_' + item + '_display').update(asMoney(itemTotal[item]));
// update balance
updateBalance();
}
2009-01-06 11:49:19 +01:00
function asMoney(amount) {
return String(amount.toFixed(2)).replace(/\./, ",");
}
function calcUnits(unitSize, quantity, tolerance) {
units = Math.floor(quantity / unitSize)
remainder = quantity % unitSize
return units + ((remainder > 0) && (remainder + tolerance >= unitSize) ? 1 : 0)
}
function unitCompletedFromTolerance(unitSize, quantity, tolerance) {
remainder = quantity % unitSize
return (remainder > 0 && (remainder + tolerance >= unitSize));
}
function updateBalance() {
// update total price and order balance
total = 0;
for (i = 0; i < itemTotal.length; i++) {
total += itemTotal[i];
}
$('total_price').update(asMoney(total));
balance = groupBalance - total;
$('new_balance').update(asMoney(balance));
$('total_balance').value = asMoney(balance);
// determine bgcolor and submit button state according to balance
if (balance < 0) {
bgcolor = '#FF0000';
$('submit_button').disabled = true;
} else {
bgcolor = '';
$('submit_button').disabled = false;
}
// update bgcolor
for (i = 0; i < itemTotal.length; i++) {
$('td_price_' + i).style.backgroundColor = bgcolor;
}
}
function confirmSwitchOrder() {
return (!modified || confirm('Änderungen an dieser Bestellung gehen verloren, wenn zu einer anderen Bestellung gewechselt wird.'))
}