Version 0.1.0. Removed localization because it was messy, parts were localized and others not. In production and recipes ingredients not in stock are marked in red.

Sun, 24 Feb 2019 17:23:52 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Sun, 24 Feb 2019 17:23:52 +0100
changeset 286
124af734af68
parent 285
0ea9dfb3fce9
child 287
ad939b702674

Version 0.1.0. Removed localization because it was messy, parts were localized and others not. In production and recipes ingredients not in stock are marked in red.

config.status file | annotate | diff | comparison | revisions
configure file | annotate | diff | comparison | revisions
configure.ac file | annotate | diff | comparison | revisions
www/js/global.js file | annotate | diff | comparison | revisions
www/js/inv_equipments.js file | annotate | diff | comparison | revisions
www/js/inv_fermentables.js file | annotate | diff | comparison | revisions
www/js/inv_hops.js file | annotate | diff | comparison | revisions
www/js/inv_miscs.js file | annotate | diff | comparison | revisions
www/js/inv_waters.js file | annotate | diff | comparison | revisions
www/js/inv_yeasts.js file | annotate | diff | comparison | revisions
www/js/prod_edit.js file | annotate | diff | comparison | revisions
www/js/prod_inprod.js file | annotate | diff | comparison | revisions
www/js/profile_fermentation.js file | annotate | diff | comparison | revisions
www/js/profile_mash.js file | annotate | diff | comparison | revisions
www/js/profile_styles.js file | annotate | diff | comparison | revisions
www/js/profile_water.js file | annotate | diff | comparison | revisions
www/js/rec_edit.js file | annotate | diff | comparison | revisions
www/js/rec_main.js file | annotate | diff | comparison | revisions
--- a/config.status	Sat Feb 23 22:56:35 2019 +0100
+++ b/config.status	Sun Feb 24 17:23:52 2019 +0100
@@ -621,7 +621,7 @@
 S["CC"]="gcc"
 S["CYEARS"]="2016-2019"
 S["COPYRIGHT"]="Copyright (C) 2016-2019 Michiel Broek, All Rights Reserved"
-S["VERSION"]="0.0.6"
+S["VERSION"]="0.1.0"
 S["PACKAGE"]="bms"
 S["SUBDIRS"]="bmsd doc script tools www"
 S["target_alias"]=""
@@ -709,7 +709,7 @@
 D["PACKAGE_STRING"]=" \"\""
 D["PACKAGE_BUGREPORT"]=" \"\""
 D["PACKAGE_URL"]=" \"\""
-D["VERSION"]=" \"0.0.6\""
+D["VERSION"]=" \"0.1.0\""
 D["COPYRIGHT"]=" \"Copyright (C) 2016-2019 Michiel Broek, All Rights Reserved\""
 D["STDC_HEADERS"]=" 1"
 D["HAVE_SYS_TYPES_H"]=" 1"
--- a/configure	Sat Feb 23 22:56:35 2019 +0100
+++ b/configure	Sun Feb 24 17:23:52 2019 +0100
@@ -2031,7 +2031,7 @@
 
 
 PACKAGE="bms"
-VERSION="0.0.6"
+VERSION="0.1.0"
 COPYRIGHT="Copyright (C) 2016-2019 Michiel Broek, All Rights Reserved"
 CYEARS="2016-2019"
 
--- a/configure.ac	Sat Feb 23 22:56:35 2019 +0100
+++ b/configure.ac	Sun Feb 24 17:23:52 2019 +0100
@@ -8,7 +8,7 @@
 dnl General settings
 dnl After changeing the version number, run autoconf!
 PACKAGE="bms"
-VERSION="0.0.6"
+VERSION="0.1.0"
 COPYRIGHT="Copyright (C) 2016-2019 Michiel Broek, All Rights Reserved"
 CYEARS="2016-2019"
 AC_SUBST(PACKAGE)
--- a/www/js/global.js	Sat Feb 23 22:56:35 2019 +0100
+++ b/www/js/global.js	Sun Feb 24 17:23:52 2019 +0100
@@ -698,7 +698,7 @@
 var mashlist = new $.jqx.dataAdapter(mashProfileSource);
 
 
-
+/*
 function getLocalization() {
 	var localizationobj = {};
 	localizationobj.pagerGoToPageString = "Gehe zu:";
@@ -746,7 +746,7 @@
 	localizationobj.months = months;
 	return localizationobj;
 }
-
+*/
 
 
 $(document).ready(function () {
--- a/www/js/inv_equipments.js	Sat Feb 23 22:56:35 2019 +0100
+++ b/www/js/inv_equipments.js	Sun Feb 24 17:23:52 2019 +0100
@@ -222,7 +222,6 @@
 		source: dataAdapter,
 		theme: theme,
 		showstatusbar: true,
-		localization: getLocalization(),
 		renderstatusbar: function (statusbar) {
 			var container = $("<div style='overflow: hidden; position: relative; margin: 5px;'></div>");
 			var addButton = $("<div style='float: right; margin-right: 15px;'><img style='position: relative; margin-top: 2px;' src='images/add.png'/><span style='margin-left: 4px; position: relative; top: -3px;'>Nieuw</span></div>");
@@ -277,7 +276,7 @@
 			{ text: 'Kook volume', datafield: 'boil_size', width: 110, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
 			{ text: 'Batch volume', datafield: 'batch_size', width: 110, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
 			{ text: 'Opmerkingen', datafield: 'notes' },
-			{ text: 'Wijzig', datafield: 'Edit', width: 100, align: 'center', columntype: 'button', cellsrenderer: function () {
+			{ text: '', datafield: 'Edit', width: 100, align: 'center', columntype: 'button', cellsrenderer: function () {
 				return "Wijzig";
 				}, buttonclick: function (row) {
 					// open the popup window when the user clicks a button.
--- a/www/js/inv_fermentables.js	Sat Feb 23 22:56:35 2019 +0100
+++ b/www/js/inv_fermentables.js	Sun Feb 24 17:23:52 2019 +0100
@@ -197,7 +197,6 @@
 		source: dataAdapter,
 		theme: theme,
 		showstatusbar: true,
-		localization: getLocalization(),
 		renderstatusbar: function (statusbar) {
 			var container = $("<div style='overflow: hidden; position: relative; margin: 5px;'></div>");
 			var addButton = $("<div style='float: right; margin-right: 15px;'><img style='position: relative; margin-top: 2px;' src='images/add.png'/><span style='margin-left: 4px; position: relative; top: -3px;'>Nieuw</span></div>");
@@ -243,26 +242,29 @@
 			{ text: 'Vergistbaar product', datafield: 'name', menu: false },
 			{ text: 'Soort', width: 135, filtertype: 'list', datafield: 'type',
 			  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-				  return "<div style='margin: 4px;' class='jqx-center-align'>" + FermentableTypeData[rowdata.type].nl + "</div>";
-			  },
+				return "<span style='margin: 3px; margin-top: 6px; float: left;'>" + FermentableTypeData[value].nl + "</span>";
+			  }
 			},
 			{ text: 'Graan type', datafield: 'graintype', align: 'center', cellsalign: 'center', width: 125,
 			  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-				return "<div style='margin: 4px;' class='jqx-center-align'>" + GrainTypeData[value].nl + "</div>";
+				return "<span style='margin: 3px; margin-top: 6px; float: left;'>" + GrainTypeData[value].nl + "</span>";
 			  }
 		       	},
 			{ text: 'EBC', datafield: 'color', width: 60, align: 'right', menu: false, cellsalign: 'right' },
 			{ text: 'Opbrengst', datafield: 'yield', width: 70, align: 'right', menu: false, cellsalign: 'right', cellsformat: 'p1' },
 			{ text: 'Voorraad', datafield: 'inventory', width: 100, align: 'right', menu: false,
 			  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-				if (value == 0)
-					return "<div style='margin: 4px;' class='jqx-right-align'></div>";
-				if (value < 1)
-					return "<div style='margin: 4px;' class='jqx-right-align'>"+value * 1000+" gr</div>";
-				return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value,"f1")+" kg</div>";
+				var amount = "";
+				if (value > 0) {
+					if (value < 1)
+						amount = value * 1000+" gr";
+					else
+						amount = dataAdapter.formatNumber(value,"f1")+" kg";
+				}
+				return "<span style='margin: 3px; margin-top: 6px; float: right;'>" + amount + "</span>";
 			  }
 			},
-			{ text: 'Wijzig', datafield: 'Edit', width: 100, align: 'center', menu: false, columntype: 'button', cellsrenderer: function () {
+			{ text: '', datafield: 'Edit', width: 100, align: 'center', menu: false, columntype: 'button', cellsrenderer: function () {
 				return "Wijzig";
 				}, buttonclick: function (row) {
 					// open the popup window when the user clicks a button.
--- a/www/js/inv_hops.js	Sat Feb 23 22:56:35 2019 +0100
+++ b/www/js/inv_hops.js	Sun Feb 24 17:23:52 2019 +0100
@@ -180,7 +180,6 @@
 		source: dataAdapter,
 		theme: theme,
 		showstatusbar: true,
-		localization: getLocalization(),
 		renderstatusbar: function (statusbar) {
 			var container = $("<div style='overflow: hidden; position: relative; margin: 5px;'></div>");
 			var addButton = $("<div style='float: right; margin-right: 15px;'><img style='position: relative; margin-top: 2px;' src='images/add.png'/><span style='margin-left: 4px; position: relative; top: -3px;'>Nieuw</span></div>");
@@ -218,14 +217,14 @@
 		columns: [
 			{ text: 'Herkomst', datafield: 'origin', width: 150 },
 			{ text: 'Hop Naam', datafield: 'name', menu: false },
-			{ text: 'Soort', datafield: 'type', align: 'center', menu: false, width: 90,
+			{ text: 'Soort', datafield: 'type', align: 'left', menu: false, width: 90,
 			  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-				return "<div style='margin: 4px;' class='jqx-center-align'>" + HopTypeData[value].nl + "</div>";
+				return  '<span style="margin: 4px; margin-top: 6px; float: left;">' + HopTypeData[value].nl + '</span>';
 			  }
 			},
-			{ text: 'Vorm', datafield: 'form', align: 'center', menu: false, width: 90,
+			{ text: 'Vorm', datafield: 'form', align: 'left', menu: false, width: 90,
 			  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-				return "<div style='margin: 4px;' class='jqx-center-align'>" + HopFormData[value].nl + "</div>";
+				return  '<span style="margin: 4px; margin-top: 6px; float: left;">' + HopFormData[value].nl + '</span>';
 			  }
 		       	},
 			{ text: 'Alpha %', datafield: 'alpha', width: 80, align: 'right', cellsalign: 'right', menu: false, cellsformat: 'p1' },
@@ -235,14 +234,17 @@
 			{ text: 'Oogst datum', datafield: 'production_date', align: 'center', cellsalign: 'center', menu: false, width: 110 },
 			{ text: 'Voorraad', datafield: 'inventory', width: 100, align: 'right', cellsalign: 'right', menu: false, cellsformat: 'f1',
 			  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-				if (value == 0)
-					return "<div style='margin: 4px;' class='jqx-right-align'></div>";
-				if (value < 1000)
-					return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value,"f1")+" gr</div>";
-				return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value / 1000.0,"f1")+" kg</div>";
+				var amount = "";
+				if (value > 0) {
+					if (value < 1000)
+						amount = dataAdapter.formatNumber(value,"f1")+" gr";
+					else
+						amount = dataAdapter.formatNumber(value / 1000.0,"f1")+" kg";
+				}
+				return  '<span style="margin: 4px; margin-top: 6px; float: right;">' + amount + '</span>';
 			  }
 		       	},
-			{ text: 'Wijzig', datafield: 'Wijzig', columntype: 'button', width: 100, align: 'center', menu: false, cellsrenderer: function () {
+			{ text: '', datafield: 'Wijzig', columntype: 'button', width: 100, align: 'center', menu: false, cellsrenderer: function () {
 				return "Wijzig";
 				}, buttonclick: function (row) {
 					// open the popup window when the user clicks a button.
--- a/www/js/inv_miscs.js	Sat Feb 23 22:56:35 2019 +0100
+++ b/www/js/inv_miscs.js	Sun Feb 24 17:23:52 2019 +0100
@@ -175,7 +175,6 @@
 		source: dataAdapter,
 		theme: theme,
 		showstatusbar: true,
-		localization: getLocalization(),
 		renderstatusbar: function (statusbar) {
 			var container = $("<div style='overflow: hidden; position: relative; margin: 5px;'></div>");
 			var addButton = $("<div style='float: right; margin-right: 15px;'><img style='position: relative; margin-top: 2px;' src='images/add.png'/><span style='margin-left: 4px; position: relative; top: -3px;'>Nieuw</span></div>");
@@ -205,44 +204,50 @@
 		filtermode: 'excel',
 		columns: [
 			{ text: 'Ingredient naam', datafield: 'name', menu: false },
-			{ text: 'Type', datafield: 'type', align: 'center', cellsalign: 'center', width: 120,
+			{ text: 'Type', datafield: 'type', align: 'left', width: 120,
 			  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-				return "<div style='margin: 4px;' class='jqx-center-align'>" + MiscTypeData[value].nl + "</div>";
+				return "<span style='margin: 3px; margin-top: 6px; float: left;'>" + MiscTypeData[value].nl + "</span>";
 			  }
 		       	},
-			{ text: 'Gebruik', datafield: 'use_use', align: 'center', cellsalign: 'center', width: 120,
+			{ text: 'Gebruik', datafield: 'use_use', align: 'left', width: 120,
 			  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-				return "<div style='margin: 4px;' class='jqx-center-align'>" + MiscUseData[value].nl + "</div>";
+				return "<span style='margin: 3px; margin-top: 6px; float: left;'>" + MiscUseData[value].nl + "</span>";
 			  }
 			},
 			{ text: 'Tijd', datafield: 'time', width: 90, align: 'left', menu: false,
 			  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-				if (value == 0)
-					return "<div style='margin: 4px;' class='jqx-left-align'></div>";
-				if (value == 1)
-					return "<div style='margin: 4px;' class='jqx-left-align'>1 minuut</div>";
-				if (value < 60)
-					return "<div style='margin: 4px;' class='jqx-left-align'>"+dataAdapter.formatNumber(value, "f0")+" minuten</div>";
-				if (value == 60)
-					return "<div style='margin: 4px;' class='jqx-left-align'>1 uur</div>";
-				if (value < 1440)
-					return "<div style='margin: 4px;' class='jqx-left-align'>"+dataAdapter.formatNumber(value / 60, "f0")+" uren</div>";
-				if (value == 1440)
-					return "<div style='margin: 4px;' class='jqx-left-align'>1 dag</div>";
-				return "<div style='margin: 4px;' class='jqx-left-align'>"+dataAdapter.formatNumber(value / 1440, "f0")+" dagen</div>";
+				var duration = "";
+				if (value > 0) {
+					if (value == 1)
+						duration = "1 minuut";
+					else if (value < 60)
+						duration = dataAdapter.formatNumber(value, "f0")+" minuten";
+					else if (value == 60)
+						duration = "1 uur";
+					else if (value < 1440)
+						duration = dataAdapter.formatNumber(value / 60, "f0")+" uren";
+					else if (value == 1440)
+						duration = "1 dag";
+					else
+						duration = dataAdapter.formatNumber(value / 1440, "f0")+" dagen";
+				}
+				return "<span style='margin: 3px; margin-top: 6px; float: left;'>" + duration + "</span>";
 			  }
 		       	},
-			{ text: 'Voorraad', datafield: 'inventory', width: 110, menu: false, align: 'right', cellsalign: 'right',
+			{ text: 'Voorraad', datafield: 'inventory', width: 110, menu: false, align: 'right',
 			  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-				if (value == 0)
-					return "<div style='margin: 4px;' class='jqx-right-align'></div>";
-				if (rowdata.amount_is_weight)
-					return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value,"f1")+" gr</div>";
-				return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value,"f1")+" ml</div>";
+				var amount = "";
+				if (value > 0) {
+					if (rowdata.amount_is_weight)
+						amount = dataAdapter.formatNumber(value,"f1")+" gr";
+					else
+						amount = dataAdapter.formatNumber(value,"f1")+" ml";
+				}
+				return "<span style='margin: 3px; margin-top: 6px; float: right;'>" + amount + "</span>";
 			  }
 		       	},
 			{ text: 'THT datum', datafield: 'tht_date', width: 100, menu: false, align: 'center', cellsalign: 'center' },
-			{ text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, menu: false, align: 'center', cellsrenderer: function () {
+			{ text: '', datafield: 'Edit', columntype: 'button', width: 100, menu: false, align: 'center', cellsrenderer: function () {
 				return "Wijzig";
 				}, buttonclick: function (row) {
 					// open the popup window when the user clicks a button.
--- a/www/js/inv_waters.js	Sat Feb 23 22:56:35 2019 +0100
+++ b/www/js/inv_waters.js	Sun Feb 24 17:23:52 2019 +0100
@@ -158,7 +158,6 @@
 		source: dataAdapter,
 		theme: theme,
 		showstatusbar: true,
-		localization: getLocalization(),
 		renderstatusbar: function (statusbar) {
 			var container = $("<div style='overflow: hidden; position: relative; margin: 5px;'></div>");
 			var addButton = $("<div style='float: right; margin-right: 15px;'><img style='position: relative; margin-top: 2px;' src='images/add.png'/><span style='margin-left: 4px; position: relative; top: -3px;'>Nieuw</span></div>");
@@ -192,12 +191,13 @@
 			{ text: 'Onbeperkt', datafield: 'unlimited_stock', columntype: 'checkbox', width: 80 },
 			{ text: 'Voorraad', datafield: 'inventory', width: 100, align: 'right', cellsalign: 'right', cellsformat: 'f1',
 			  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-				if ((value == 0) || rowdata.unlimited_stock)
-					return "<div style='margin: 4px;' class='jqx-right-align'></div>";
-				return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value,"f1")+" L</div>";
+				var amount = "";
+				if (value > 0 && rowdata.unlimited_stock == 0)
+					amount = dataAdapter.formatNumber(value,"f1")+" L";
+				return "<span style='margin: 3px; margin-top: 6px; float: right;'>" + amount + "</span>";
 			  }
 			},
-			{ text: 'Wijzig', datafield: 'Edit', width: 100, align: 'center', columntype: 'button', cellsrenderer: function () {
+			{ text: '', datafield: 'Edit', width: 100, align: 'center', columntype: 'button', cellsrenderer: function () {
 				return "Wijzig";
 				}, buttonclick: function (row) {
 					// open the popup window when the user clicks a button.
--- a/www/js/inv_yeasts.js	Sat Feb 23 22:56:35 2019 +0100
+++ b/www/js/inv_yeasts.js	Sun Feb 24 17:23:52 2019 +0100
@@ -201,7 +201,6 @@
 		source: dataAdapter,
 		theme: theme,
 		showstatusbar: true,
-		localization: getLocalization(),
 		renderstatusbar: function (statusbar) {
 			var container = $("<div style='overflow: hidden; position: relative; margin: 5px;'></div>");
 			var addButton = $("<div style='float: right; margin-right: 15px;'><img style='position: relative; margin-top: 2px;' src='images/add.png'/><span style='margin-left: 4px; position: relative; top: -3px;'>Nieuw</span></div>");
@@ -249,20 +248,23 @@
 			  }
 			},
 			{ text: 'SVG', datafield: 'attenuation', width: 80, align: 'right', cellsalign: 'right', menu: false, cellsformat: 'p1' },
-			{ text: 'Voorraad', datafield: 'inventory', width: 100, align: 'right', menu: false, cellsalign: 'right',
+			{ text: 'Voorraad', datafield: 'inventory', width: 100, align: 'right', menu: false,
 			  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-				if (value == 0)
-					return "<div style='margin: 4px;' class='jqx-right-align'></div>";
-				if ((rowdata.form == 0) && (value > 1))
-					return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value,"f0")+" pakken</div>";
-				if (rowdata.form == 0)
-					return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value,"f0")+" pak</div>";
-				if (rowdata.form == 1)
-					return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value * 1000,"f1")+" gram</div>";
-				return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value * 1000,"f1")+" ml</div>";
+				var amount = "";
+				if (value > 0) {
+					if ((rowdata.form == 0) && (value > 1))
+						amount = dataAdapter.formatNumber(value,"f0")+" pakken";
+					else if (rowdata.form == 0)
+						amount = dataAdapter.formatNumber(value,"f0")+" pak";
+					else if (rowdata.form == 1)
+						amount = dataAdapter.formatNumber(value * 1000,"f1")+" gram";
+					else
+						amount = dataAdapter.formatNumber(value * 1000,"f1")+" ml";
+				}
+				return "<span style='margin: 3px; margin-top: 6px; float: right;'>" + amount + "</span>";
 			  }
 			},
-			{ text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', menu: false, cellsrenderer: function () {
+			{ text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', menu: false, cellsrenderer: function () {
 				return "Wijzig";
 				}, buttonclick: function (row) {
 					// open the popup window when the user clicks a button.
--- a/www/js/prod_edit.js	Sat Feb 23 22:56:35 2019 +0100
+++ b/www/js/prod_edit.js	Sun Feb 24 17:23:52 2019 +0100
@@ -3001,11 +3001,10 @@
                 var fermentableAdapter = new $.jqx.dataAdapter(fermentableSource);
                 $("#fermentableGrid").jqxGrid({
                         width: 1240,
-                        height: 450,
+                        height: 500,
                         source: fermentableAdapter,
                         theme: theme,
                         selectionmode: 'singlerow',
-                        localization: getLocalization(),
                         showtoolbar: true,
                         rendertoolbar: function (toolbar) {
                                 var me = this;
@@ -3129,28 +3128,35 @@
                         },
                         columns: [
                                 { text: 'Vergistbaar ingredi&euml;nt', datafield: 'f_name',
-                                  cellsrenderer:  function (row, columnfield, value, defaulthtml, columnproperties) {
-                                        var rowData = $("#fermentableGrid").jqxGrid('getrowdata', row);
-                                        return "<span style='margin: 3px; margin-top: 6px; float: "+
-                                                columnproperties.cellsalign+"'>" +rowData.f_supplier+" / "+rowData.f_name+" ("+rowData.f_color+" EBC)</span>";
+                                  cellsrenderer:  function (index, datafield, value, defaultvalue, column, rowdata) {
+                                        return "<span style='margin: 3px; margin-top: 6px; float: left;'>" +
+						rowdata.f_supplier+" / "+rowdata.f_name+" ("+rowdata.f_color+" EBC)</span>";
                                   }
                                 },
                                 { text: 'Type', width: 100, datafield: 'f_type',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + FermentableTypeData[value].nl + "</div>";
+					return "<span style='margin: 3px; margin-top: 6px; float: left;'>" + FermentableTypeData[value].nl + "</span>";
 				  }
 			       	},
                                 { text: 'Moment', width: 110, datafield: 'f_added',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + AddedData[value].nl + "</div>";
+					return "<span style='margin: 3px; margin-top: 6px; float: left;'>" + AddedData[value].nl + "</span>";
                                   }
                                 },
                                 { text: 'Opbrengst', datafield: 'f_yield', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'p1' },
                                 { text: 'Gewicht Kg', datafield: 'f_amount', width: 120, align: 'right', cellsalign: 'right', cellsformat: 'f3' },
-				{ text: 'Voorr. Kg', datafield: 'f_inventory', width: 120, align: 'right', cellsalign: 'right', cellsformat: 'f3' },
-                                { text: 'Percent', datafield: 'f_percentage', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'p1' },
+				{ text: 'Voorraad Kg', datafield: 'f_inventory', width: 120, align: 'right',
+				  cellsrenderer:  function (row, columnfield, value, defaulthtml, columnproperties, rowdata) {
+					var color = '#ffffff';
+					if (value < rowdata.f_amount)
+						color = '#ff4040';
+					return  '<span style="margin: 4px; margin-top: 6px; float: right; color: ' +
+						color + ';">' +fermentableAdapter.formatNumber(value, "f3") + '</span>';
+				  }
+				},
+                                { text: 'Procent', datafield: 'f_percentage', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'p1' },
                                 { text: '100%', align: 'center', datafield: 'f_adjust_to_total_100', columntype: 'checkbox', width: 70 },
-				{ text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
+				{ text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
 					return "Wijzig";
 					}, buttonclick: function (row) {
 						if (dataRecord.stage <= 3) {
@@ -3207,11 +3213,10 @@
                 var hopAdapter = new $.jqx.dataAdapter(hopSource);
                 $("#hopGrid").jqxGrid({
                         width: 1240,
-                        height: 510,
+                        height: 560,
                         source: hopAdapter,
                         theme: theme,
                         selectionmode: 'singlerow',
-                        localization: getLocalization(),
                         showtoolbar: true,
                         rendertoolbar: function (toolbar) {
                                 var me = this;
@@ -3289,69 +3294,64 @@
                         },
                         columns: [
                                 { text: 'Hop', datafield: 'h_name',
-                                  cellsrenderer: function (row, columnfield, value, defaulthtml, columnproperties) {
-                                        var rowData = $("#hopGrid").jqxGrid('getrowdata', row);
-                                        return "<span style='margin: 3px; margin-top: 6px; float: "+
-                                                columnproperties.cellsalign+"'>" +rowData.h_origin+" / "+rowData.h_name+"</span>";
+                                  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
+                                        return "<span style='margin: 3px; margin-top: 6px; float: left;'>" +rowdata.h_origin+" / "+rowdata.h_name+"</span>";
                                   },
                                 },
                                 { text: 'Type', width: 90, datafield: 'h_type',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + HopTypeData[value].nl + "</div>";
+					return  '<span style="margin: 4px; margin-top: 6px; float: left;">' + HopTypeData[value].nl + '</span>';
 				  }
 			       	},
                                 { text: 'Vorm', width: 90, datafield: 'h_form',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + HopFormData[value].nl + "</div>";
+					return  '<span style="margin: 4px; margin-top: 6px; float: left;">' + HopFormData[value].nl + '</span>';
 				  }
 			       	},
                                 { text: 'Alpha', datafield: 'h_alpha', width: 80, align: 'right', cellsalign: 'right', cellsformat: 'p1' },
 				{ text: 'Gebruik', width: 110, datafield: 'h_useat',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + HopUseData[value].nl + "</div>";
+					return  '<span style="margin: 4px; margin-top: 6px; float: left;">' + HopUseData[value].nl + '</span>';
 				  }
 				},
 				{ text: 'Tijdsduur', datafield: 'h_time', width: 90, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
+					var duration = '';
 					if ((rowdata.h_useat == 2) || (rowdata.h_useat == 4))   // Boil, Whirlpool
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value, "f0")+" min.</div>";
-					if (rowdata.h_useat == 5)       // Dry hop
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value/1440, "f0")+" dagen</div>";
-					else
-						return "<div style='margin: 4px;'></div>";
+						duration = dataAdapter.formatNumber(value, "f0")+" min.";
+					else if (rowdata.h_useat == 5)       // Dry hop
+						duration = dataAdapter.formatNumber(value/1440, "f0")+" dagen";
+					return  '<span style="margin: 4px; margin-top: 6px; float: right;">' + duration + '</span>';
 				  }
 				},
                                 { text: 'IBU', datafield: 'ibu', width: 80, align: 'right',
                                   cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-                                        var ibu = toIBU(rowdata.h_useat,
-                                                          rowdata.h_form,
-                                                          preboil_sg,
-                                                          parseFloat($("#batch_size").jqxNumberInput('decimal')),
-                                                          parseFloat(rowdata.h_amount),
-                                                          parseFloat(rowdata.h_time),
-                                                          parseFloat(rowdata.h_alpha),
-                                                          $("#ibu_method").val()
-                                                         );
-                                        return "<div style='margin: 4px;' class='jqx-right-align'>" + dataAdapter.formatNumber(ibu, "f1") + "</div>";
+                                        var ibu = toIBU(rowdata.h_useat, rowdata.h_form, preboil_sg, parseFloat($("#batch_size").jqxNumberInput('decimal')),
+                                                          parseFloat(rowdata.h_amount), parseFloat(rowdata.h_time),
+                                                          parseFloat(rowdata.h_alpha), $("#ibu_method").val());
+					return  '<span style="margin: 4px; margin-top: 6px; float: right;">' + dataAdapter.formatNumber(ibu, "f1") + '</span>';
                                   }
                                 },
-				{ text: 'Gewicht', datafield: 'h_amount', width: 110, align: 'right', cellsalign: 'right',
+				{ text: 'Gewicht', datafield: 'h_amount', width: 110, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
+					var amount = dataAdapter.formatNumber(value, "f1") + ' kg';
 					if (value < 1)
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value * 1000, "f1")+" gr</div>";
-					else
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value, "f1")+" kg</div>";
+						amount = dataAdapter.formatNumber(value * 1000, "f1") + ' gr';
+					return  '<span style="margin: 4px; margin-top: 6px; float: right;">' + amount + '</span>';
 				  }
 				},
-				{ text: 'Voorraad', datafield: 'h_inventory', width: 110, align: 'right', cellsalign: 'right',
+				{ text: 'Voorraad', datafield: 'h_inventory', width: 110, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
+					var color = '#ffffff';
+					if (value < rowdata.h_amount)
+						color = '#ff4040';
+					var amount = dataAdapter.formatNumber(value, "f1") + ' kg';
 					if (value < 1)
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value * 1000, "f1")+" gr</div>";
-					else
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value, "f1")+" kg</div>";
+						amount = dataAdapter.formatNumber(value * 1000, "f1") + ' gr';
+					return  '<span style="margin: 4px; margin-top: 6px; float: right; color: ' + color + ';">' + amount + '</span>';
 				  }
 				},
-				{ text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
+				{ text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
 					return "Wijzig";
 					}, buttonclick: function (row) {
 						if (dataRecord.stage <= 3) {
@@ -3466,11 +3466,10 @@
                 });
                 $("#miscGrid").jqxGrid({
                         width: 1240,
-                        height: 525,
+                        height: 575,
                         source: miscAdapter,
                         theme: theme,
                         selectionmode: 'singlerow',
-                        localization: getLocalization(),
                         showtoolbar: true,
                         rendertoolbar: function (toolbar) {
                                 var me = this;
@@ -3533,39 +3532,42 @@
                                 { text: 'Ingredient', datafield: 'm_name' },
                                 { text: 'Type', width: 140, datafield: 'm_type',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + MiscTypeData[value].nl + "</div>";
+					return "<span style='margin: 3px; margin-top: 6px; float: left;'>" + MiscTypeData[value].nl + "</span>";
 				  }
 			       	},
                                 { text: 'Gebruik', width: 140, datafield: 'm_use_use',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + MiscUseData[value].nl + "</div>";
+					return "<span style='margin: 3px; margin-top: 6px; float: left;'>" + MiscUseData[value].nl + "</span>";
                                   }
                                	},
                                	{ text: 'Tijd', datafield: 'm_time', width: 90, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					if (rowdata.m_use_use == 2) {   // Boil
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value, "f0")+" min.</div>";
-					} else if ((rowdata.m_use_use == 3) || (rowdata.m_use_use == 4)) {      // Primary or Secondary
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value/1440, "f0")+" dagen</div>";
-					} else {
-						var tijd = 0;
-						return "<div style='margin: 4px;'> </div>";
-					}
+					var duration = '';
+					if (rowdata.m_use_use == 2)	// Boil
+						duration = dataAdapter.formatNumber(value, "f0")+" min.";
+					else if ((rowdata.m_use_use == 3) || (rowdata.m_use_use == 4))	// Primary or Secondary
+						duration = dataAdapter.formatNumber(value/1440, "f0")+" dagen";
+					return  '<span style="margin: 4px; margin-top: 6px; float: right;">' + duration + '</span>';
 				  },
                                 },
 				{ text: 'Hoeveel', datafield: 'm_amount', width: 110, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
 					var vstr = rowdata.m_amount_is_weight ? "gr":"ml";
-					return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value * 1000,"f2")+" "+vstr+"</div>";
+					return  '<span style="margin: 4px; margin-top: 6px; float: right;">' +
+						dataAdapter.formatNumber(value * 1000,"f2")+" "+vstr + '</span>';
 				  }
 				},
 				{ text: 'Voorraad', datafield: 'm_inventory', width: 110, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
 					var vstr = rowdata.m_amount_is_weight ? "gr":"ml";
-					return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value * 1000,"f2")+" "+vstr+"</div>";
+					var color = '#ffffff';
+					if (value < rowdata.m_amount)
+						color = '#ff4040';
+					var amount = dataAdapter.formatNumber(value * 1000,"f2")+" "+vstr;
+					return  '<span style="margin: 4px; margin-top: 6px; float: right; color: ' + color + ';">' + amount + '</span>';
 				  }
 				},
-				{ text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
+				{ text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
 					return "Wijzig";
 					}, buttonclick: function (row) {
 						if (dataRecord.stage <= 3) {
@@ -3630,7 +3632,6 @@
                         source: yeastAdapter,
                         theme: theme,
                         selectionmode: 'singlerow',
-                        localization: getLocalization(),
                         showtoolbar: true,
                         rendertoolbar: function (toolbar) {
                                 var me = this;
@@ -3710,7 +3711,7 @@
                                 { text: 'Code', width: 90, datafield: 'y_product_id' },
                                 { text: 'Soort', width: 100, datafield: 'y_form',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + YeastFormData[value].nl + "</div>";
+					return  '<span style="margin: 4px; margin-top: 6px; float: left;">' + YeastFormData[value].nl + '</span>';
 				  }
 			       	},
                                 { text: 'Min. &deg;C', width: 70, align: 'right', cellsalign: 'right', datafield: 'y_min_temperature' },
@@ -3718,32 +3719,33 @@
                                 { text: 'Attn. %', width: 70, align: 'right', cellsalign: 'right', datafield: 'y_attenuation', cellsformat: 'f1' },
                                 { text: 'Voor', width: 120, datafield: 'y_use',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + YeastUseData[value].nl + "</div>";
+					return  '<span style="margin: 4px; margin-top: 6px; float: left;">' + YeastUseData[value].nl + '</span>';
                                   }
                                 },
 				{ text: 'Hoeveel', datafield: 'y_amount', width: 100, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					if (rowdata.y_form == 0) {      // Liquid
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value, "f0")+" pk</div>";
-					} else if (rowdata.y_form == 1) {       // Dry
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value*1000, "f1")+" gr</div>";
-					} else {
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value*1000, "f0")+" ml</div>";
-					}
+					var amount = dataAdapter.formatNumber(value*1000, "f0")+" ml";
+					if (rowdata.y_form == 0)	// Liquid
+						amount = dataAdapter.formatNumber(value, "f0")+" pk";
+					else if (rowdata.y_form == 1)	// Dry
+						amount = dataAdapter.formatNumber(value*1000, "f1")+" gr";
+					return  '<span style="margin: 4px; margin-top: 6px; float: right;">' + amount + '</span>';
 				  }
 				},
 				{ text: 'Voorraad', datafield: 'y_inventory', width: 100, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					if (rowdata.y_form == 0) {      // Liquid
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value, "f0")+" pk</div>";
-					} else if (rowdata.y_form == 1) {       // Dry
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value*1000, "f1")+" gr</div>";
-					} else {
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value*1000, "f0")+" ml</div>";
-					}
+					var color = '#ffffff';
+					if (value < rowdata.y_amount)
+						color = '#ff4040';
+					var amount = dataAdapter.formatNumber(value*1000, "f0")+" ml";
+					if (rowdata.y_form == 0)        // Liquid
+						amount = dataAdapter.formatNumber(value, "f0")+" pk";
+					else if (rowdata.y_form == 1)   // Dry
+						amount = dataAdapter.formatNumber(value*1000, "f1")+" gr";
+					return  '<span style="margin: 4px; margin-top: 6px; float: right; color: ' + color + ';">' + amount + '</span>';
 				  }
 				},
-				{ text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
+				{ text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
 					return "Wijzig";
 					}, buttonclick: function (row) {
 						if (dataRecord.stage <= 3) {
@@ -3826,7 +3828,6 @@
                         source: mashAdapter,
                         theme: theme,
                         selectionmode: 'singlerow',
-                        localization: getLocalization(),
                         showtoolbar: true,
                         rendertoolbar: function (toolbar) {
                                 var me = this;
@@ -3859,15 +3860,15 @@
                                 { text: 'Stap naam', datafield: 'step_name' },
                                 { text: 'Stap type', datafield: 'step_type', width: 175,
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + MashStepTypeData[value].nl + "</div>";
+					return  '<span style="margin: 4px; margin-top: 6px; float: left;">' + MashStepTypeData[value].nl + '</span>';
                                   }
                                 },
                                 { text: 'Start &deg;C', datafield: 'step_temp', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
                                 { text: 'Eind &deg;C', datafield: 'end_temp', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
-                                { text: 'Tijd', datafield: 'step_time', width: 90, align: 'right', cellsalign: 'right' },
-                                { text: 'Stap', datafield: 'ramp_time', width: 90, align: 'right', cellsalign: 'right' },
-                                { text: 'Infuse', datafield: 'step_infuse_amount', width: 90, align: 'right', cellsalign: 'right' },
-				{ text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
+                                { text: 'Rust min.', datafield: 'step_time', width: 90, align: 'right', cellsalign: 'right' },
+                                { text: 'Stap min.', datafield: 'ramp_time', width: 90, align: 'right', cellsalign: 'right' },
+                                { text: 'Infuse L.', datafield: 'step_infuse_amount', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
+				{ text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
 					return "Wijzig";
 					}, buttonclick: function (row) {
 						if (dataRecord.stage <= 3) {
--- a/www/js/prod_inprod.js	Sat Feb 23 22:56:35 2019 +0100
+++ b/www/js/prod_inprod.js	Sun Feb 24 17:23:52 2019 +0100
@@ -43,7 +43,6 @@
 		source: dataAdapter,
 		theme: theme,
 		showstatusbar: true,
-		localization: getLocalization(),
 		renderstatusbar: function (statusbar) {
 			var container = $("<div style='overflow: hidden; position: relative; margin: 5px;'></div>");
 			var addButton = $("<div style='float: right; margin-right: 15px;'><img style='position: relative; margin-top: 2px;' src='images/add.png'/><span style='margin-left: 4px; position: relative; top: -3px;'>Add</span></div>");
@@ -62,10 +61,10 @@
 			{ text: 'Naam', datafield: 'name' },
 			{ text: 'Fase', datafield: 'stage', width: 130,
 			  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-				return "<div style='margin: 4px;'>" + StageData[value].nl + "</div>";
+				return "<span style='margin: 3px; margin-top: 6px; float: left;'>" + StageData[value].nl + "</span>";
 			  }
 		       	},
-			{ text: 'Wijzig', datafield: 'Edit', width: 100, align: 'center', columntype: 'button', cellsrenderer: function () {
+			{ text: '', datafield: 'Edit', width: 100, align: 'center', columntype: 'button', cellsrenderer: function () {
 				return "Wijzig";
 				}, buttonclick: function (row) {
 					var datarecord = dataAdapter.records[row];
--- a/www/js/profile_fermentation.js	Sat Feb 23 22:56:35 2019 +0100
+++ b/www/js/profile_fermentation.js	Sun Feb 24 17:23:52 2019 +0100
@@ -239,7 +239,6 @@
 		source: dataAdapter,
 		theme: theme,
 		showstatusbar: true,
-		localization: getLocalization(),
 		renderstatusbar: function (statusbar) {
 			var container = $("<div style='overflow: hidden; position: relative; margin: 5px;'></div>");
 			var addButton = $("<div style='float: right; margin-right: 15px;'><img style='position: relative; margin-top: 2px;' src='images/add.png'/><span style='margin-left: 4px; position: relative; top: -3px;'>Nieuw</span></div>");
@@ -266,9 +265,8 @@
 			{ text: 'Min. start &deg;C', datafield: 'inittemp_lo', width: 150, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
 			{ text: 'Max. start &deg;C', datafield: 'inittemp_hi', width: 150, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
 			{ text: 'Stappen', datafield: 'totalsteps', width: 80, align: 'right', cellsalign: 'right' },
-			{ text: 'Tijdsduur', datafield: 'duration', width: 150, align: 'right', cellsalign: 'right',
-			  cellsrenderer:  function (row, columnfield, value, defaulthtml, columnproperties) {
-				//var rowData = $("#fermentableGrid").jqxGrid('getrowdata', row);
+			{ text: 'Tijdsduur', datafield: 'duration', width: 150, align: 'right',
+			  cellsrenderer:  function (row, columnfield, value, defaulthtml, column) {
 				if (value < 24) {
 					var show = value+" uur";
 				} else {
@@ -279,10 +277,10 @@
 					else
 						var show = days+" dagen, "+hours+" uur";
 				}
-				return "<span style='margin: 3px; margin-top: 6px; float: "+columnproperties.cellsalign+"'>"+show+"</span>";
+				return "<span style='margin: 3px; margin-top: 6px; float: right;'>"+show+"</span>";
 			  }
 		       	},
-			{ text: 'Wijzig', datafield: 'Edit', width: 100, align: 'center', columntype: 'button', cellsrenderer: function () {
+			{ text: '', datafield: 'Edit', width: 100, align: 'center', columntype: 'button', cellsrenderer: function () {
 				return "Wijzig";
 				}, buttonclick: function (row) {
 					editrow = row;
--- a/www/js/profile_mash.js	Sat Feb 23 22:56:35 2019 +0100
+++ b/www/js/profile_mash.js	Sun Feb 24 17:23:52 2019 +0100
@@ -1,5 +1,5 @@
 /*****************************************************************************
- * Copyright (C) 2014-2018
+ * Copyright (C) 2014-2019
  *
  * Michiel Broek <mbroek at mbse dot eu>
  *
@@ -174,7 +174,6 @@
 			source: stepAdapter,
 			theme: theme,
 			selectionmode: 'singlerow',
-			localization: getLocalization(),
 			showtoolbar: true,
 			rendertoolbar: function (toolbar) {
 				var me = this;
@@ -183,7 +182,7 @@
 				container.append('<input style="margin-left: 100px;" id="addrowbutton" type="button" value="Nieuwe stap" />');
 				container.append('<input style="margin-left: 450px;" id="deleterowbutton" type="button" value="Verwijder stap" />');
 				$("#addrowbutton").jqxButton({ template: "primary", theme: theme, width: 150 });
-				$("#deleterowbutton").jqxButton({ template: "primary", theme: theme, width: 150 });
+				$("#deleterowbutton").jqxButton({ template: "danger", theme: theme, width: 150 });
 				// create new row.
 				$("#addrowbutton").on('click', function () {
 					var datarow = generaterow();
@@ -208,9 +207,9 @@
 				},
 				{ text: 'Begin &deg;C', datafield: 'step_temp', width: 100, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
 				{ text: 'Eind &deg;C', datafield: 'end_temp', width: 100, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
-				{ text: 'Rusttijd', datafield: 'step_time', width: 80, align: 'right', cellsalign: 'right' },
-				{ text: 'Opwarmtijd', datafield: 'ramp_time', width: 80, align: 'right', cellsalign: 'right' },
-				{ text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
+				{ text: 'Rust min.', datafield: 'step_time', width: 90, align: 'right', cellsalign: 'right' },
+				{ text: 'Stap min.', datafield: 'ramp_time', width: 90, align: 'right', cellsalign: 'right' },
+				{ text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
 					return "Wijzig";
 					}, buttonclick: function (row) {
 						steprow = row;
@@ -240,7 +239,6 @@
 		source: dataAdapter,
 		theme: theme,
 		showstatusbar: true,
-		localization: getLocalization(),
 		renderstatusbar: function (statusbar) {
 			var container = $("<div style='overflow: hidden; position: relative; margin: 5px;'></div>");
 			var addButton = $("<div style='float: right; margin-right: 15px;'><img style='position: relative; margin-top: 2px;' src='images/add.png'/><span style='margin-left: 4px; position: relative; top: -3px;'>Add</span></div>");
@@ -261,7 +259,7 @@
 		columns: [
 			{ text: 'Maish schema', datafield: 'name', width: 250 },
 			{ text: 'Opmerkingen', datafield: 'notes' },
-			{ text: 'Wijzig', datafield: 'Edit', width: 100, align: 'center', columntype: 'button', cellsrenderer: function () {
+			{ text: '', datafield: 'Edit', width: 100, align: 'center', columntype: 'button', cellsrenderer: function () {
 				return "Wijzig";
 				}, buttonclick: function (row) {
 					editrow = row;
--- a/www/js/profile_styles.js	Sat Feb 23 22:56:35 2019 +0100
+++ b/www/js/profile_styles.js	Sun Feb 24 17:23:52 2019 +0100
@@ -130,7 +130,6 @@
 			});
 		}
 	};
-	var srcType = [ "Lager", "Ale", "Mead", "Wheat", "Mixed", "Cider" ];
 	// initialize the input fields.
 	$("#name").jqxInput({ theme: theme, width: 320, height: 23 });
 	$("#category").jqxInput({ theme: theme, width: 320, height: 23 });
@@ -180,7 +179,6 @@
 		source: dataAdapter,
 		theme: theme,
 		showstatusbar: true,
-		localization: getLocalization(),
 		renderstatusbar: function (statusbar) {
 			var container = $("<div style='overflow: hidden; position: relative; margin: 5px;'></div>");
 			var addButton = $("<div style='float: right; margin-right: 15px;'><img style='position: relative; margin-top: 2px;' src='images/add.png'/><span style='margin-left: 4px; position: relative; top: -3px;'>Nieuw</span></div>");
@@ -232,7 +230,7 @@
 			{ text: 'Co2', menu: false, datafield: 'carb_max', width: 60, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
 			{ text: 'ABV', menu: false, datafield: 'abv_min', width: 60, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
 			{ text: 'ABV', menu: false, datafield: 'abv_max', width: 60, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
-			{ text: 'Wijzig', menu: false, datafield: 'Edit', width: 100, align: 'center', columntype: 'button', cellsrenderer: function () {
+			{ text: '', menu: false, datafield: 'Edit', width: 100, align: 'center', columntype: 'button', cellsrenderer: function () {
 				return "Wijzig";
 				}, buttonclick: function (row) {
 					// open the popup window when the user clicks a button.
--- a/www/js/profile_water.js	Sat Feb 23 22:56:35 2019 +0100
+++ b/www/js/profile_water.js	Sun Feb 24 17:23:52 2019 +0100
@@ -151,7 +151,6 @@
 		source: dataAdapter,
 		theme: theme,
 		showstatusbar: true,
-		localization: getLocalization(),
 		renderstatusbar: function (statusbar) {
 			var container = $("<div style='overflow: hidden; position: relative; margin: 5px;'></div>");
 			var addButton = $("<div style='float: right; margin-right: 15px;'><img style='position: relative; margin-top: 2px;' src='images/add.png'/><span style='margin-left: 4px; position: relative; top: -3px;'>Nieuw</span></div>");
@@ -187,7 +186,7 @@
 			{ text: 'Cl', datafield: 'chloride', width: 60, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
 			{ text: 'SO4', datafield: 'sulfate', width: 60, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
 			{ text: 'pH', datafield: 'ph', width: 60, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
-			{ text: 'Wijzig', datafield: 'Edit', width: 100, columntype: 'button', cellsrenderer: function () {
+			{ text: '', datafield: 'Edit', width: 100, columntype: 'button', cellsrenderer: function () {
 				return "Wijzig";
 				}, buttonclick: function (row) {
 					// open the popup window when the user clicks a button.
--- a/www/js/rec_edit.js	Sat Feb 23 22:56:35 2019 +0100
+++ b/www/js/rec_edit.js	Sun Feb 24 17:23:52 2019 +0100
@@ -1734,11 +1734,10 @@
 		var fermentableAdapter = new $.jqx.dataAdapter(fermentableSource);
 		$("#fermentableGrid").jqxGrid({
 			width: 1240,
-			height: 450,
+			height: 500,
 			source: fermentableAdapter,
 			theme: theme,
 			selectionmode: 'singlerow',
-			localization: getLocalization(),
 			showtoolbar: true,
 			rendertoolbar: function (toolbar) {
 				var me = this;
@@ -1861,28 +1860,35 @@
 			},
 			columns: [
 				{ text: 'Vergistbaar ingredi&euml;nt', datafield: 'f_name',
-				  cellsrenderer:  function (row, columnfield, value, defaulthtml, columnproperties) {
-					var rowData = $("#fermentableGrid").jqxGrid('getrowdata', row);
-					return "<span style='margin: 3px; margin-top: 6px; float: "+
-						columnproperties.cellsalign+"'>" +rowData.f_supplier+" / "+rowData.f_name+" ("+rowData.f_color+" EBC)</span>";
+				  cellsrenderer:  function (index, datafield, value, defaulvalue, column, rowdata) {
+					return "<span style='margin: 3px; margin-top: 6px; float: left;'>" +
+						rowdata.f_supplier+" / "+rowdata.f_name+" ("+rowdata.f_color+" EBC)</span>";
 				  }
 			       	},
 				{ text: 'Type', width: 100, datafield: 'f_type',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + FermentableTypeData[value].nl + "</div>";
+					return "<span style='margin: 3px; margin-top: 6px; float: left;'>" + FermentableTypeData[value].nl + "</span>";
 				  }
 				},
 				{ text: 'Moment', width: 110, datafield: 'f_added',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + AddedData[value].nl + "</div>";
+					return "<span style='margin: 3px; margin-top: 6px; float: left;'>" + AddedData[value].nl + "</span>";
 				  }
 				},
 				{ text: 'Opbrengst', editable: false, datafield: 'f_yield', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'p1' },
 				{ text: 'Gewicht Kg', datafield: 'f_amount', width: 120, align: 'right', cellsalign: 'right', cellsformat: 'f3' },
-				{ text: 'Voorr. Kg', datafield: 'f_inventory', width: 120, align: 'right', cellsalign: 'right', cellsformat: 'f3' },
-				{ text: 'Percent', datafield: 'f_percentage', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'p1' },
+				{ text: 'Voorr. Kg', datafield: 'f_inventory', width: 120, align: 'right',
+				  cellsrenderer:  function (row, columnfield, value, defaulthtml, columnproperties, rowdata) {
+					var color = '#ffffff';
+					if (value < rowdata.f_amount)
+						color = '#ff4040';
+					return  '<span style="margin: 4px; margin-top: 6px; float: right; color: ' +
+						color + ';">' +fermentableAdapter.formatNumber(value, "f3") + '</span>';
+				  }
+				},
+				{ text: 'Procent', datafield: 'f_percentage', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'p1' },
 				{ text: '100%', align: 'center', datafield: 'f_adjust_to_total_100', columntype: 'checkbox', width: 70 },
-				{ text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
+				{ text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
 					return "Wijzig";
 				        }, buttonclick: function (row) {
 						fermentableRow = row;
@@ -1937,11 +1943,10 @@
                 var hopAdapter = new $.jqx.dataAdapter(hopSource);
                 $("#hopGrid").jqxGrid({
                         width: 1240,
-                        height: 510,
+                        height: 560,
                         source: hopAdapter,
                         theme: theme,
                         selectionmode: 'singlerow',
-                        localization: getLocalization(),
                         showtoolbar: true,
                         rendertoolbar: function (toolbar) {
                                 var me = this;
@@ -2018,69 +2023,64 @@
 			},
                         columns: [
                                 { text: 'Hop', datafield: 'h_name',
-				  cellsrenderer: function (row, columnfield, value, defaulthtml, columnproperties) {
-					var rowData = $("#hopGrid").jqxGrid('getrowdata', row);
-					return "<span style='margin: 3px; margin-top: 6px; float: "+
-						columnproperties.cellsalign+"'>" +rowData.h_origin+" / "+rowData.h_name+"</span>";
+				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
+					return "<span style='margin: 3px; margin-top: 6px; float: left;'>" +rowdata.h_origin+" / "+rowdata.h_name+"</span>";
 				  },
 			       	},
                                 { text: 'Type', width: 90, datafield: 'h_type',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + HopTypeData[value].nl + "</div>";
+					return  '<span style="margin: 4px; margin-top: 6px; float: left;">' + HopTypeData[value].nl + '</span>';
 				  }
 			       	},
 				{ text: 'Vorm', width: 90, datafield: 'h_form',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + HopFormData[value].nl + "</div>";
+					return  '<span style="margin: 4px; margin-top: 6px; float: left;">' + HopFormData[value].nl + '</span>';
 				  }
 			       	},
                                 { text: 'Alpha', datafield: 'h_alpha', width: 80, align: 'right', cellsalign: 'right', cellsformat: 'p1' },
 				{ text: 'Gebruik', width: 110, datafield: 'h_useat',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + HopUseData[value].nl + "</div>";
+					return  '<span style="margin: 4px; margin-top: 6px; float: left;">' + HopUseData[value].nl + '</span>';
 				  }
 				},
 				{ text: 'Tijdsduur', datafield: 'h_time', width: 90, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					if ((rowdata.h_useat == 2) || (rowdata.h_useat == 4))	// Boil, Whirlpool
-					       	return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value, "f0")+" min.</div>";
-					if (rowdata.h_useat == 5)	// Dry hop
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value/1440, "f0")+" dagen</div>";
-					else
-						return "<div style='margin: 4px;'></div>";
+					var duration = '';
+					if ((rowdata.h_useat == 2) || (rowdata.h_useat == 4))   // Boil, Whirlpool
+						duration = dataAdapter.formatNumber(value, "f0")+" min.";
+					else if (rowdata.h_useat == 5)       // Dry hop
+						duration = dataAdapter.formatNumber(value/1440, "f0")+" dagen";
+					return  '<span style="margin: 4px; margin-top: 6px; float: right;">' + duration + '</span>';
 				  }
 				},
 				{ text: 'IBU', datafield: 'ibu', width: 80, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					var ibu = toIBU(rowdata.h_useat,
-							  rowdata.h_form,
-							  preboil_sg,
-							  parseFloat($("#batch_size").jqxNumberInput('decimal')),
-							  parseFloat(rowdata.h_amount),
-							  parseFloat(rowdata.h_time),
-							  parseFloat(rowdata.h_alpha),
-							  $("#ibu_method").val()
-							 );
-					return "<div style='margin: 4px;' class='jqx-right-align'>" + dataAdapter.formatNumber(ibu, "f1") + "</div>";
+					var ibu = toIBU(rowdata.h_useat, rowdata.h_form, preboil_sg, parseFloat($("#batch_size").jqxNumberInput('decimal')),
+							  parseFloat(rowdata.h_amount), parseFloat(rowdata.h_time),
+							  parseFloat(rowdata.h_alpha), $("#ibu_method").val());
+					return  '<span style="margin: 4px; margin-top: 6px; float: right;">' + dataAdapter.formatNumber(ibu, "f1") + '</span>';
 				  }
 				},
-				{ text: 'Gewicht', datafield: 'h_amount', width: 110, align: 'right', cellsalign: 'right',
+				{ text: 'Gewicht', datafield: 'h_amount', width: 110, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
+					var amount = dataAdapter.formatNumber(value, "f1") + ' kg';
 					if (value < 1)
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value * 1000, "f1")+" gr</div>";
-					else
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value, "f1")+" kg</div>";
+						amount = dataAdapter.formatNumber(value * 1000, "f1") + ' gr';
+					return  '<span style="margin: 4px; margin-top: 6px; float: right;">' + amount + '</span>';
 				  }
 				},
-				{ text: 'Voorraad', datafield: 'h_inventory', width: 110, align: 'right', cellsalign: 'right',
+				{ text: 'Voorraad', datafield: 'h_inventory', width: 110, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
+					var color = '#ffffff';
+					if (value < rowdata.h_amount)
+						color = '#ff4040';
+					var amount = dataAdapter.formatNumber(value, "f1") + ' kg';
 					if (value < 1)
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value * 1000, "f1")+" gr</div>";
-					else
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value, "f1")+" kg</div>";
+						amount = dataAdapter.formatNumber(value * 1000, "f1") + ' gr';
+					return  '<span style="margin: 4px; margin-top: 6px; float: right; color: ' + color + ';">' + amount + '</span>';
 				  }
 				},
-				{ text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
+				{ text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
 					return "Wijzig";
 					}, buttonclick: function (row) {
 						hopRow = row;
@@ -2193,11 +2193,10 @@
 		});
                 $("#miscGrid").jqxGrid({
                         width: 1240,
-                        height: 525,
+                        height: 575,
                         source: miscAdapter,
                         theme: theme,
                         selectionmode: 'singlerow',
-                        localization: getLocalization(),
                         showtoolbar: true,
                         rendertoolbar: function (toolbar) {
                                 var me = this;
@@ -2259,39 +2258,42 @@
                                 { text: 'Ingredient', datafield: 'm_name' },
                                 { text: 'Type', width: 140, datafield: 'm_type',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + MiscTypeData[value].nl + "</div>";
+					return "<span style='margin: 3px; margin-top: 6px; float: left;'>" + MiscTypeData[value].nl + "</span>";
 				  }
 			       	},
                                 { text: 'Gebruik', width: 140, datafield: 'm_use_use',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + MiscUseData[value].nl + "</div>";
+					return "<span style='margin: 3px; margin-top: 6px; float: left;'>" + MiscUseData[value].nl + "</span>";
 				  }
 			       	},
                                 { text: 'Tijd', datafield: 'm_time', width: 90, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					if (rowdata.m_use_use == 2) {	// Boil
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value, "f0")+" min.</div>";
-					} else if ((rowdata.m_use_use == 3) || (rowdata.m_use_use == 4)) {	// Primary or Secondary
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value/1440, "f0")+" dagen</div>";
-					} else {
-						var tijd = 0;
-						return "<div style='margin: 4px;'> </div>";
-					}
+					var duration = '';
+					if (rowdata.m_use_use == 2)     // Boil
+						duration = dataAdapter.formatNumber(value, "f0")+" min.";
+					else if ((rowdata.m_use_use == 3) || (rowdata.m_use_use == 4))  // Primary or Secondary
+						duration = dataAdapter.formatNumber(value/1440, "f0")+" dagen";
+					return  '<span style="margin: 4px; margin-top: 6px; float: right;">' + duration + '</span>';
 				  },
                                 },
 				{ text: 'Hoeveel', datafield: 'm_amount', width: 110, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
 					var vstr = rowdata.m_amount_is_weight ? "gr":"ml";
-					return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value * 1000,"f2")+" "+vstr+"</div>";
+					return  '<span style="margin: 4px; margin-top: 6px; float: right;">' +
+						dataAdapter.formatNumber(value * 1000,"f2")+" "+vstr + '</span>';
 				  },
 				},
 				{ text: 'Voorraad', datafield: 'm_inventory', width: 110, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
 					var vstr = rowdata.m_amount_is_weight ? "gr":"ml";
-					return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value * 1000,"f2")+" "+vstr+"</div>";
+					var color = '#ffffff';
+					if (value < rowdata.m_amount)
+						color = '#ff4040';
+					var amount = dataAdapter.formatNumber(value * 1000,"f2")+" "+vstr;
+					return  '<span style="margin: 4px; margin-top: 6px; float: right; color: ' + color + ';">' + amount + '</span>';
 				  },
 				},
-				{ text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
+				{ text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
 					return "Wijzig";
 					}, buttonclick: function (row) {
 						miscRow = row;
@@ -2350,11 +2352,10 @@
                 var yeastAdapter = new $.jqx.dataAdapter(yeastSource);
                 $("#yeastGrid").jqxGrid({
                         width: 1240,
-                        height: 400,
+                        height: 350,
                         source: yeastAdapter,
                         theme: theme,
                         selectionmode: 'singlerow',
-                        localization: getLocalization(),
                         showtoolbar: true,
                         rendertoolbar: function (toolbar) {
                                 var me = this;
@@ -2429,7 +2430,7 @@
 				{ text: 'Code', width: 90, datafield: 'y_product_id' },
                                 { text: 'Soort', width: 100, datafield: 'y_form',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + YeastFormData[value].nl + "</div>";
+					return  '<span style="margin: 4px; margin-top: 6px; float: left;">' + YeastFormData[value].nl + '</span>';
 				  }
 				},
 				{ text: 'Min. &deg;C', width: 70, align: 'right', cellsalign: 'right', datafield: 'y_min_temperature' },
@@ -2437,32 +2438,33 @@
 				{ text: 'Attn. %', width: 70, align: 'right', cellsalign: 'right', datafield: 'y_attenuation', cellsformat: 'f1' },
 				{ text: 'Voor', width: 120, datafield: 'y_use',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					return "<div style='margin: 4px;'>" + YeastUseData[value].nl + "</div>";
+					return  '<span style="margin: 4px; margin-top: 6px; float: left;">' + YeastUseData[value].nl + '</span>';
 				  }
 				},
 				{ text: 'Hoeveel', datafield: 'y_amount', width: 100, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					if (rowdata.y_form == 0) {	// Liquid
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value, "f0")+" pk</div>";
-					} else if (rowdata.y_form == 1) {	// Dry
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value*1000, "f1")+" gr</div>";
-					} else {
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value*1000, "f0")+" ml</div>";
-					}
+					var amount = dataAdapter.formatNumber(value*1000, "f0")+" ml";
+					if (rowdata.y_form == 0)        // Liquid
+						amount = dataAdapter.formatNumber(value, "f0")+" pk";
+					else if (rowdata.y_form == 1)   // Dry
+						amount = dataAdapter.formatNumber(value*1000, "f1")+" gr";
+					return  '<span style="margin: 4px; margin-top: 6px; float: right;">' + amount + '</span>';
                                   }
                                 },
 				{ text: 'Voorraad', datafield: 'y_inventory', width: 100, align: 'right',
 				  cellsrenderer: function (index, datafield, value, defaultvalue, column, rowdata) {
-					if (rowdata.y_form == 0) {      // Liquid
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value, "f0")+" pk</div>";
-					} else if (rowdata.y_form == 1) {       // Dry
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value*1000, "f1")+" gr</div>";
-					} else {
-						return "<div style='margin: 4px;' class='jqx-right-align'>"+dataAdapter.formatNumber(value*1000, "f0")+" ml</div>";
-					}
+					var color = '#ffffff';
+					if (value < rowdata.y_amount)
+						color = '#ff4040';
+					var amount = dataAdapter.formatNumber(value*1000, "f0")+" ml";
+					if (rowdata.y_form == 0)        // Liquid
+						amount = dataAdapter.formatNumber(value, "f0")+" pk";
+					else if (rowdata.y_form == 1)   // Dry
+						amount = dataAdapter.formatNumber(value*1000, "f1")+" gr";
+					return  '<span style="margin: 4px; margin-top: 6px; float: right; color: ' + color + ';">' + amount + '</span>';
 				  }
 				},
-				{ text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
+				{ text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
 					return "Wijzig";
 					}, buttonclick: function (row) {
 						yeastRow = row;
@@ -2543,7 +2545,6 @@
                         source: mashAdapter,
                         theme: theme,
                         selectionmode: 'singlerow',
-                        localization: getLocalization(),
                         showtoolbar: true,
                         rendertoolbar: function (toolbar) {
                                 var me = this;
@@ -2583,10 +2584,10 @@
 				},
 				{ text: 'Start &deg;C', datafield: 'step_temp', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
 				{ text: 'Eind &deg;C', datafield: 'end_temp', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
-				{ text: 'Tijd', datafield: 'step_time', width: 90, align: 'right', cellsalign: 'right' },
-				{ text: 'Stap', datafield: 'ramp_time', width: 90, align: 'right', cellsalign: 'right' },
-				{ text: 'Infuse', datafield: 'step_infuse_amount', width: 90, align: 'right', cellsalign: 'right' },
-				{ text: 'Wijzig', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
+				{ text: 'Rust min.', datafield: 'step_time', width: 90, align: 'right', cellsalign: 'right' },
+				{ text: 'Stap min.', datafield: 'ramp_time', width: 90, align: 'right', cellsalign: 'right' },
+				{ text: 'Infuse L.', datafield: 'step_infuse_amount', width: 90, align: 'right', cellsalign: 'right', cellsformat: 'f1' },
+				{ text: '', datafield: 'Edit', columntype: 'button', width: 100, align: 'center', cellsrenderer: function () {
 					return "Wijzig";
 					}, buttonclick: function (row) {
 						mashRow = row;
--- a/www/js/rec_main.js	Sat Feb 23 22:56:35 2019 +0100
+++ b/www/js/rec_main.js	Sun Feb 24 17:23:52 2019 +0100
@@ -48,13 +48,12 @@
 		groupable: true,
 		theme: theme,
 		showstatusbar: true,
-		localization: getLocalization(),
 		renderstatusbar: function (statusbar) {
 			var container = $("<div style='overflow: hidden; position: relative; margin: 5px;'></div>");
 			var addButton = $("<div style='float: right; margin-right: 15px;'><img style='position: relative; margin-top: 2px;' src='images/add.png'/><span style='margin-left: 4px; position: relative; top: -3px;'>Add</span></div>");
 			container.append(addButton);
 			statusbar.append(container);
-			addButton.jqxButton({ theme: theme, width: 120, height: 20 });
+			addButton.jqxButton({ theme: theme, width: 100, height: 20 });
 			// add new recipe.
 			addButton.click(function (event) {
 				var url= "rec_new.php?return=rec_main.php";
@@ -72,7 +71,7 @@
 			{ text: 'EBC', datafield: 'est_color', width: 60, align: 'right', cellsalign: 'right', cellsformat: 'f0' },
 			{ text: 'IBU', datafield: 'est_ibu', width: 60, align: 'right', cellsalign: 'right', cellsformat: 'f0' },
 			{ text: 'ABV', datafield: 'est_abv', width: 60, align: 'right', cellsalign: 'right', cellsformat: 'p1' },
-			{ text: 'Wijzig', datafield: 'Edit', width: 120, align: 'center', columntype: 'button', cellsrenderer: function () {
+			{ text: '', datafield: 'Edit', width: 120, align: 'center', columntype: 'button', cellsrenderer: function () {
 				return "Wijzig";
 				}, buttonclick: function (row) {
 					var datarecord = dataAdapter.records[row];

mercurial