|  | @@ -2,45 +2,45 @@
 | 
		
	
		
			
			| 2 | 2 |      <layout type="vertical">
 | 
		
	
		
			
			| 3 | 3 |          <layout type="horizontal">
 | 
		
	
		
			
			| 4 | 4 |              <button type="push" id="target" name="Load profile as target" />
 | 
		
	
		
			
			| 5 |  | -			<button type="push" id="viewprofile" name="View profile" />
 | 
		
	
		
			
			| 6 |  | -			<button type="push" id="compare" name="Compare profile" />
 | 
		
	
		
			
			| 7 |  | -			<button type="push" id="edit" name="Edit" />
 | 
		
	
		
			
			|  | 5 | +            <button type="push" id="viewprofile" name="View profile" />
 | 
		
	
		
			
			|  | 6 | +            <button type="push" id="compare" name="Compare profile" />
 | 
		
	
		
			
			|  | 7 | +            <button type="push" id="edit" name="Edit" />
 | 
		
	
		
			
			| 8 | 8 |          </layout>
 | 
		
	
		
			
			| 9 | 9 |          <webview id="view" />
 | 
		
	
		
			
			| 10 | 10 |      </layout>
 | 
		
	
		
			
			| 11 | 11 |  	<menu name="File">
 | 
		
	
		
			
			| 12 |  | -		<item id="save" shortcut="Ctrl+S">Save…</item>
 | 
		
	
		
			
			|  | 12 | +            <item id="save" shortcut="Ctrl+S">Save…</item>
 | 
		
	
		
			
			| 13 | 13 |  	</menu>
 | 
		
	
		
			
			| 14 | 14 |      <program>
 | 
		
	
		
			
			| 15 | 15 |          <![CDATA[
 | 
		
	
		
			
			| 16 |  | -			var window = this;
 | 
		
	
		
			
			| 17 |  | -			dataView = findChildObject(this, 'view');
 | 
		
	
		
			
			| 18 |  | -			var fileID;
 | 
		
	
		
			
			| 19 |  | -			var target = findChildObject(this, 'target');
 | 
		
	
		
			
			| 20 |  | -			var compare = findChildObject(this, 'compare');
 | 
		
	
		
			
			| 21 |  | -			var edit = findChildObject(this, 'edit');
 | 
		
	
		
			
			| 22 |  | -			edit.enabled = false;
 | 
		
	
		
			
			| 23 |  | -			if(typeof(Windows.loggingWindow) == "undefined") {
 | 
		
	
		
			
			| 24 |  | -				compare.enabled = false;
 | 
		
	
		
			
			| 25 |  | -				target.enabled = false;
 | 
		
	
		
			
			| 26 |  | -			}
 | 
		
	
		
			
			| 27 |  | -			var tableReference;
 | 
		
	
		
			
			| 28 |  | -			var rowReference;
 | 
		
	
		
			
			| 29 |  | -			var batchTime;
 | 
		
	
		
			
			| 30 |  | -			var machine;
 | 
		
	
		
			
			| 31 |  | -			var approval;
 | 
		
	
		
			
			| 32 |  | -			var annotation;
 | 
		
	
		
			
			| 33 |  | -			edit.clicked.connect(function() {
 | 
		
	
		
			
			| 34 |  | -				var editWindow = createWindow("editBatchDetails");
 | 
		
	
		
			
			| 35 |  | -				editWindow.loadData(window, tableReference, rowReference, batchTime, machine, approval, annotation);
 | 
		
	
		
			
			| 36 |  | -			});
 | 
		
	
		
			
			| 37 |  | -			compare.clicked.connect(function() {
 | 
		
	
		
			
			| 38 |  | -				var query = new QSqlQuery;
 | 
		
	
		
			
			| 39 |  | -				query.prepare("SELECT file, name FROM files WHERE id = :id");
 | 
		
	
		
			
			| 40 |  | -				query.bind(":id", Number(fileID));
 | 
		
	
		
			
			| 41 |  | -				query.exec();
 | 
		
	
		
			
			| 42 |  | -				query.next();
 | 
		
	
		
			
			| 43 |  | -				var buffer = new QBuffer(query.value(0));
 | 
		
	
		
			
			|  | 16 | +            var window = this;
 | 
		
	
		
			
			|  | 17 | +            dataView = findChildObject(this, 'view');
 | 
		
	
		
			
			|  | 18 | +            var fileID;
 | 
		
	
		
			
			|  | 19 | +            var target = findChildObject(this, 'target');
 | 
		
	
		
			
			|  | 20 | +            var compare = findChildObject(this, 'compare');
 | 
		
	
		
			
			|  | 21 | +            var edit = findChildObject(this, 'edit');
 | 
		
	
		
			
			|  | 22 | +            edit.enabled = false;
 | 
		
	
		
			
			|  | 23 | +            if(typeof(Windows.loggingWindow) == "undefined") {
 | 
		
	
		
			
			|  | 24 | +                compare.enabled = false;
 | 
		
	
		
			
			|  | 25 | +                target.enabled = false;
 | 
		
	
		
			
			|  | 26 | +            }
 | 
		
	
		
			
			|  | 27 | +            var tableReference;
 | 
		
	
		
			
			|  | 28 | +            var rowReference;
 | 
		
	
		
			
			|  | 29 | +            var batchTime;
 | 
		
	
		
			
			|  | 30 | +            var machine;
 | 
		
	
		
			
			|  | 31 | +            var approval;
 | 
		
	
		
			
			|  | 32 | +            var annotation;
 | 
		
	
		
			
			|  | 33 | +            edit.clicked.connect(function() {
 | 
		
	
		
			
			|  | 34 | +                var editWindow = createWindow("editBatchDetails");
 | 
		
	
		
			
			|  | 35 | +                editWindow.loadData(window, tableReference, rowReference, batchTime, machine, approval, annotation);
 | 
		
	
		
			
			|  | 36 | +            });
 | 
		
	
		
			
			|  | 37 | +            compare.clicked.connect(function() {
 | 
		
	
		
			
			|  | 38 | +                var query = new QSqlQuery;
 | 
		
	
		
			
			|  | 39 | +                query.prepare("SELECT file, name FROM files WHERE id = :id");
 | 
		
	
		
			
			|  | 40 | +                query.bind(":id", Number(fileID));
 | 
		
	
		
			
			|  | 41 | +                query.exec();
 | 
		
	
		
			
			|  | 42 | +                query.next();
 | 
		
	
		
			
			|  | 43 | +                var buffer = new QBuffer(query.value(0));
 | 
		
	
		
			
			| 44 | 44 |                  var pname = query.value(1);
 | 
		
	
		
			
			| 45 | 45 |                  query = query.invalidate();
 | 
		
	
		
			
			| 46 | 46 |                  var startSeries = Number(QSettings.value('cseries', 3));
 | 
		
	
	
		
			
			|  | @@ -50,300 +50,297 @@
 | 
		
	
		
			
			| 50 | 50 |                  var graph = findChildObject(Windows.loggingWindow, 'graph');
 | 
		
	
		
			
			| 51 | 51 |                  input.measure.connect(graph.newMeasurement);
 | 
		
	
		
			
			| 52 | 52 |                  input.input();
 | 
		
	
		
			
			| 53 |  | -				query = query.invalidate();
 | 
		
	
		
			
			| 54 |  | -			});
 | 
		
	
		
			
			| 55 |  | -			target.clicked.connect(function() {
 | 
		
	
		
			
			| 56 |  | -				var query = new QSqlQuery;
 | 
		
	
		
			
			| 57 |  | -				query.prepare("SELECT file, name FROM files WHERE id = :id");
 | 
		
	
		
			
			| 58 |  | -				query.bind(":id", Number(fileID));
 | 
		
	
		
			
			| 59 |  | -				query.exec();
 | 
		
	
		
			
			| 60 |  | -				query.next();
 | 
		
	
		
			
			| 61 |  | -				var buffer = new QBuffer(query.value(0));
 | 
		
	
		
			
			| 62 |  | -				var pname = query.value(1);
 | 
		
	
		
			
			| 63 | 53 |                  query = query.invalidate();
 | 
		
	
		
			
			| 64 |  | -				var input = new XMLInput(buffer, 1);
 | 
		
	
		
			
			| 65 |  | -				var graph = findChildObject(Windows.loggingWindow, 'graph');
 | 
		
	
		
			
			| 66 |  | -				var log = findChildObject(Windows.loggingWindow, 'log');
 | 
		
	
		
			
			| 67 |  | -				log.clear();
 | 
		
	
		
			
			| 68 |  | -				graph.clear();
 | 
		
	
		
			
			| 69 |  | -				input.newTemperatureColumn.connect(log.setHeaderData);
 | 
		
	
		
			
			| 70 |  | -				input.newTemperatureColumn.connect(function(col, text) {
 | 
		
	
		
			
			| 71 |  | -					if(text == Windows.loggingWindow.targetcolumnname)
 | 
		
	
		
			
			| 72 |  | -					{
 | 
		
	
		
			
			| 73 |  | -						targetseries = col;
 | 
		
	
		
			
			| 74 |  | -					}
 | 
		
	
		
			
			| 75 |  | -				});
 | 
		
	
		
			
			| 76 |  | -				input.newAnnotationColumn.connect(log.setHeaderData);
 | 
		
	
		
			
			| 77 |  | -				input.measure.connect(graph.newMeasurement);
 | 
		
	
		
			
			| 78 |  | -				input.measure.connect(log.newMeasurement);
 | 
		
	
		
			
			| 79 |  | -				input.measure.connect(function(data, series) {
 | 
		
	
		
			
			| 80 |  | -					if(series == targetseries)
 | 
		
	
		
			
			| 81 |  | -					{
 | 
		
	
		
			
			| 82 |  | -						targetDetector.newMeasurement(data);
 | 
		
	
		
			
			| 83 |  | -					}
 | 
		
	
		
			
			| 84 |  | -				});
 | 
		
	
		
			
			| 85 |  | -				var lc;
 | 
		
	
		
			
			| 86 |  | -				input.lastColumn.connect(function(c) {
 | 
		
	
		
			
			| 87 |  | -					lc = c;
 | 
		
	
		
			
			| 88 |  | -					QSettings.setValue("liveColumn", c + 1);
 | 
		
	
		
			
			| 89 |  | -					Windows.loggingWindow.postLoadColumnSetup(c);
 | 
		
	
		
			
			| 90 |  | -				});
 | 
		
	
		
			
			| 91 |  | -				input.annotation.connect(log.newAnnotation);
 | 
		
	
		
			
			| 92 |  | -				input.annotation.connect(function(note, tcol, ncol) {
 | 
		
	
		
			
			| 93 |  | -					for(var i = tcol; i < ncol; i++) {
 | 
		
	
		
			
			| 94 |  | -						log.newAnnotation(note, i, ncol);
 | 
		
	
		
			
			| 95 |  | -					}
 | 
		
	
		
			
			| 96 |  | -				});
 | 
		
	
		
			
			| 97 |  | -				Windows.loggingWindow.windowTitle = "Typica - " + pname;
 | 
		
	
		
			
			| 98 |  | -				Windows.loggingWindow.raise();
 | 
		
	
		
			
			| 99 |  | -				Windows.loggingWindow.activateWindow();
 | 
		
	
		
			
			| 100 |  | -				input.input();
 | 
		
	
		
			
			| 101 |  | -				log.newAnnotation("End", 1, lc);
 | 
		
	
		
			
			| 102 |  | -				query = query.invalidate();
 | 
		
	
		
			
			| 103 |  | -			});
 | 
		
	
		
			
			| 104 |  | -			var viewbutton = findChildObject(this, 'viewprofile');
 | 
		
	
		
			
			| 105 |  | -			viewbutton.clicked.connect(function() {
 | 
		
	
		
			
			| 106 |  | -				var query = new QSqlQuery;
 | 
		
	
		
			
			| 107 |  | -				query.prepare("SELECT file, name FROM files WHERE id = :id");
 | 
		
	
		
			
			| 108 |  | -				query.bind(":id", Number(fileID));
 | 
		
	
		
			
			| 109 |  | -				query.exec();
 | 
		
	
		
			
			| 110 |  | -				if(query.next()) {
 | 
		
	
		
			
			| 111 |  | -					var viewer = createWindow('offline');
 | 
		
	
		
			
			| 112 |  | -					var buffer = new QBuffer(query.value(0));
 | 
		
	
		
			
			| 113 |  | -					var pname = query.value(1);
 | 
		
	
		
			
			| 114 |  | -					query = query.invalidate();
 | 
		
	
		
			
			| 115 |  | -					var input = new XMLInput(buffer, 1);
 | 
		
	
		
			
			| 116 |  | -					var graph = findChildObject(viewer, 'graph');
 | 
		
	
		
			
			| 117 |  | -					var log = findChildObject(viewer, 'log');
 | 
		
	
		
			
			| 118 |  | -					input.newTemperatureColumn.connect(log.setHeaderData);
 | 
		
	
		
			
			| 119 |  | -					input.newTemperatureColumn.connect(function(column) {
 | 
		
	
		
			
			| 120 |  | -						viewer.saveTemperatureColumns.push(column);
 | 
		
	
		
			
			| 121 |  | -					});
 | 
		
	
		
			
			| 122 |  | -					input.newAnnotationColumn.connect(log.setHeaderData);
 | 
		
	
		
			
			| 123 |  | -					input.newAnnotationColumn.connect(function(column) {
 | 
		
	
		
			
			| 124 |  | -						viewer.saveAnnotationColumns.push(column);
 | 
		
	
		
			
			| 125 |  | -					});
 | 
		
	
		
			
			| 126 |  | -					input.measure.connect(graph.newMeasurement);
 | 
		
	
		
			
			| 127 |  | -					input.measure.connect(log.newMeasurement);
 | 
		
	
		
			
			| 128 |  | -					input.annotation.connect(log.newAnnotation);
 | 
		
	
		
			
			| 129 |  | -					var lc;
 | 
		
	
		
			
			| 130 |  | -					input.lastColumn.connect(function(c) {
 | 
		
	
		
			
			| 131 |  | -						lc = c;
 | 
		
	
		
			
			| 132 |  | -						if(c < 3)
 | 
		
	
		
			
			| 133 |  | -						{
 | 
		
	
		
			
			| 134 |  | -							log.setHeaderData(3, "");
 | 
		
	
		
			
			| 135 |  | -						}
 | 
		
	
		
			
			| 136 |  | -					});
 | 
		
	
		
			
			| 137 |  | -					input.annotation.connect(function(note, tcol, ncol) {
 | 
		
	
		
			
			| 138 |  | -						for(var i = tcol; i < ncol; i++) {
 | 
		
	
		
			
			| 139 |  | -							log.newAnnotation(note, i, ncol);
 | 
		
	
		
			
			| 140 |  | -						}
 | 
		
	
		
			
			| 141 |  | -					});
 | 
		
	
		
			
			| 142 |  | -					viewer.windowTitle = "Typica - " + pname;
 | 
		
	
		
			
			| 143 |  | -					viewer.raise();
 | 
		
	
		
			
			| 144 |  | -					viewer.activateWindow();
 | 
		
	
		
			
			| 145 |  | -					graph.updatesEnabled = false;
 | 
		
	
		
			
			| 146 |  | -					log.updatesEnabled = false;
 | 
		
	
		
			
			| 147 |  | -					input.input();
 | 
		
	
		
			
			| 148 |  | -					log.updatesEnabled = true;
 | 
		
	
		
			
			| 149 |  | -					graph.updatesEnabled = true;
 | 
		
	
		
			
			| 150 |  | -					log.newAnnotation("End", 1, lc);
 | 
		
	
		
			
			| 151 |  | -				}
 | 
		
	
		
			
			| 152 |  | -				else {
 | 
		
	
		
			
			| 153 |  | -					print("Query returned no results");
 | 
		
	
		
			
			| 154 |  | -				}
 | 
		
	
		
			
			| 155 |  | -				query = query.invalidate();
 | 
		
	
		
			
			| 156 |  | -			});
 | 
		
	
		
			
			| 157 |  | -			window.loadData = function(table, row) {
 | 
		
	
		
			
			| 158 |  | -				tableReference = table;
 | 
		
	
		
			
			| 159 |  | -				rowReference = row;
 | 
		
	
		
			
			| 160 |  | -				var buffer = new QBuffer;
 | 
		
	
		
			
			| 161 |  | -				buffer.open(3);
 | 
		
	
		
			
			| 162 |  | -				var output = new XmlWriter(buffer);
 | 
		
	
		
			
			| 163 |  | -				output.writeStartDocument("1.0");
 | 
		
	
		
			
			| 164 |  | -				output.writeDTD('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg.dtd">');
 | 
		
	
		
			
			| 165 |  | -				output.writeStartElement("html");
 | 
		
	
		
			
			| 166 |  | -				output.writeAttribute("xmlns", "http://www.w3.org/1999/xhtml");
 | 
		
	
		
			
			| 167 |  | -				output.writeStartElement("head");
 | 
		
	
		
			
			| 168 |  | -				output.writeTextElement("title", "Batch Details");
 | 
		
	
		
			
			| 169 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 170 |  | -				output.writeStartElement("body");
 | 
		
	
		
			
			| 171 |  | -				output.writeStartElement("div");
 | 
		
	
		
			
			| 172 |  | -				output.writeAttribute("style", "float: left; padding-right: 10px");
 | 
		
	
		
			
			| 173 |  | -				output.writeStartElement("p");
 | 
		
	
		
			
			| 174 |  | -				output.writeTextElement("strong", "Roasted Coffee: ");
 | 
		
	
		
			
			| 175 |  | -				output.writeTextElement("span", table.data(row, 2));
 | 
		
	
		
			
			| 176 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 177 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 178 |  | -				output.writeStartElement("div");
 | 
		
	
		
			
			| 179 |  | -				output.writeAttribute("style", "float: left");
 | 
		
	
		
			
			| 180 |  | -				output.writeStartElement("p");
 | 
		
	
		
			
			| 181 |  | -				output.writeTextElement("strong", "Roasted On: ");
 | 
		
	
		
			
			| 182 |  | -				batchTime = table.data(row, 0);
 | 
		
	
		
			
			| 183 |  | -				output.writeTextElement("span", batchTime);
 | 
		
	
		
			
			| 184 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 185 |  | -				output.writeStartElement("p");
 | 
		
	
		
			
			| 186 |  | -				output.writeTextElement("strong", "Batch Duration: ");
 | 
		
	
		
			
			| 187 |  | -				output.writeTextElement("span", table.data(row, 6));
 | 
		
	
		
			
			| 188 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 189 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 190 |  | -				output.writeStartElement("div");
 | 
		
	
		
			
			| 191 |  | -				output.writeAttribute("style", "clear: both");
 | 
		
	
		
			
			| 192 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 193 |  | -				output.writeStartElement("table");
 | 
		
	
		
			
			| 194 |  | -				output.writeStartElement("thead");
 | 
		
	
		
			
			| 195 |  | -				output.writeStartElement("tr");
 | 
		
	
		
			
			| 196 |  | -				output.writeTextElement("th", "Green Coffee");
 | 
		
	
		
			
			| 197 |  | -				output.writeTextElement("th", "Weight (lb)");
 | 
		
	
		
			
			| 198 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 199 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 200 |  | -				output.writeStartElement("tbody");
 | 
		
	
		
			
			| 201 |  | -				var query = new QSqlQuery();
 | 
		
	
		
			
			| 202 |  | -				query.prepare("SELECT unroasted_id, unroasted_quantity, approval, files, annotation FROM roasting_log WHERE time = :time AND machine = :machine");
 | 
		
	
		
			
			| 203 |  | -				query.bind(":time", batchTime);
 | 
		
	
		
			
			| 204 |  | -				machine = table.data(row, 1);
 | 
		
	
		
			
			| 205 |  | -				query.bind(":machine", machine);
 | 
		
	
		
			
			| 206 |  | -				query.exec();
 | 
		
	
		
			
			| 207 |  | -				query.next();
 | 
		
	
		
			
			| 208 |  | -				approval = query.value(2);
 | 
		
	
		
			
			| 209 |  | -				annotation = query.value(4);
 | 
		
	
		
			
			| 210 |  | -				var items = sqlToArray(query.value(0));
 | 
		
	
		
			
			| 211 |  | -				var quantities = sqlToArray(query.value(1));
 | 
		
	
		
			
			| 212 |  | -				var nameQuery = new QSqlQuery();
 | 
		
	
		
			
			| 213 |  | -				nameQuery.prepare("SELECT name FROM items WHERE id = :id");
 | 
		
	
		
			
			| 214 |  | -				for(var i = 0; i < items.length; i++) {
 | 
		
	
		
			
			| 215 |  | -					output.writeStartElement("tr");
 | 
		
	
		
			
			| 216 |  | -					nameQuery.bind(":id", items[i]);
 | 
		
	
		
			
			| 217 |  | -					nameQuery.exec();
 | 
		
	
		
			
			| 218 |  | -					nameQuery.next();
 | 
		
	
		
			
			| 219 |  | -					output.writeTextElement("td", nameQuery.value(0) + " (" + items[i] + ")");
 | 
		
	
		
			
			| 220 |  | -					output.writeStartElement("td");
 | 
		
	
		
			
			| 221 |  | -					output.writeAttribute("align", "center");
 | 
		
	
		
			
			| 222 |  | -					output.writeCharacters(quantities[i]);
 | 
		
	
		
			
			| 223 |  | -					output.writeEndElement();
 | 
		
	
		
			
			| 224 |  | -					output.writeEndElement();
 | 
		
	
		
			
			| 225 |  | -				}
 | 
		
	
		
			
			| 226 |  | -				nameQuery = nameQuery.invalidate();
 | 
		
	
		
			
			| 227 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 228 |  | -				output.writeStartElement("tfoot");
 | 
		
	
		
			
			| 229 |  | -				output.writeStartElement("tr");
 | 
		
	
		
			
			| 230 |  | -				output.writeStartElement("td");
 | 
		
	
		
			
			| 231 |  | -				output.writeAttribute("align", "right");
 | 
		
	
		
			
			| 232 |  | -				output.writeTextElement("strong", "Green Total:");
 | 
		
	
		
			
			| 233 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 234 |  | -				output.writeStartElement("td");
 | 
		
	
		
			
			| 235 |  | -				output.writeAttribute("align", "center");
 | 
		
	
		
			
			| 236 |  | -				output.writeCharacters(table.data(row, 3));
 | 
		
	
		
			
			| 237 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 238 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 239 |  | -				output.writeStartElement("tr");
 | 
		
	
		
			
			| 240 |  | -				output.writeStartElement("td");
 | 
		
	
		
			
			| 241 |  | -				output.writeAttribute("align", "right");
 | 
		
	
		
			
			| 242 |  | -				output.writeTextElement("strong", "Roasted Weight:");
 | 
		
	
		
			
			| 243 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 244 |  | -				output.writeStartElement("td");
 | 
		
	
		
			
			| 245 |  | -				output.writeAttribute("align", "center");
 | 
		
	
		
			
			| 246 |  | -				output.writeCharacters(table.data(row, 4));
 | 
		
	
		
			
			| 247 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 248 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 249 |  | -				output.writeStartElement("tr");
 | 
		
	
		
			
			| 250 |  | -				output.writeStartElement("td");
 | 
		
	
		
			
			| 251 |  | -				output.writeAttribute("align", "right");
 | 
		
	
		
			
			| 252 |  | -				output.writeTextElement("strong", "Weight Loss:");
 | 
		
	
		
			
			| 253 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 254 |  | -				output.writeStartElement("td");
 | 
		
	
		
			
			| 255 |  | -				output.writeAttribute("align", "center");
 | 
		
	
		
			
			| 256 |  | -				output.writeCharacters(table.data(row, 5));
 | 
		
	
		
			
			| 257 |  | -				output.writeCharacters("%");
 | 
		
	
		
			
			| 258 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 259 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 260 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 261 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 262 |  | -				output.writeStartElement("p");
 | 
		
	
		
			
			| 263 |  | -				output.writeTextElement("strong", "Approved: ");
 | 
		
	
		
			
			| 264 |  | -				output.writeCharacters(approval);
 | 
		
	
		
			
			| 265 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 266 |  | -				output.writeStartElement("p");
 | 
		
	
		
			
			| 267 |  | -				output.writeTextElement("strong", "Files: ");
 | 
		
	
		
			
			| 268 |  | -				output.writeCharacters(query.value(3));
 | 
		
	
		
			
			| 269 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 270 |  | -				output.writeStartElement("p");
 | 
		
	
		
			
			| 271 |  | -				output.writeTextElement("strong", "Annotations:");
 | 
		
	
		
			
			| 272 |  | -				var files = sqlToArray(query.value(3));
 | 
		
	
		
			
			| 273 |  | -				var annotations = annotationFromRecord(files[0]);
 | 
		
	
		
			
			| 274 |  | -				fileID = files[0];
 | 
		
	
		
			
			| 275 |  | -				var buffer2 = new QBuffer("<points>"+annotations+"</points>");
 | 
		
	
		
			
			| 276 |  | -				buffer2.open(1);
 | 
		
	
		
			
			| 277 |  | -				var colQuery = new XQuery;
 | 
		
	
		
			
			| 278 |  | -				colQuery.bind("profile", buffer2);
 | 
		
	
		
			
			| 279 |  | -				colQuery.setQuery('for $i in doc($profile)//tuple[1]/temperature/@series return (string($i), ";")');
 | 
		
	
		
			
			| 280 |  | -				var result = colQuery.exec();
 | 
		
	
		
			
			| 281 |  | -				buffer2.close();
 | 
		
	
		
			
			| 282 |  | -				var seriesHeaders = new Array();
 | 
		
	
		
			
			| 283 |  | -				seriesHeaders.push("Time");
 | 
		
	
		
			
			| 284 |  | -				var records = result.split(";");
 | 
		
	
		
			
			| 285 |  | -				for(var i = 0; i < records.length - 1; i++) {
 | 
		
	
		
			
			| 286 |  | -					seriesHeaders.push(records[i].replace(/^\s+|\s+$/g,""));
 | 
		
	
		
			
			| 287 |  | -				}
 | 
		
	
		
			
			| 288 |  | -				seriesHeaders.push("Note");
 | 
		
	
		
			
			| 289 |  | -				output.writeStartElement("table");
 | 
		
	
		
			
			| 290 |  | -				output.writeStartElement("thead");
 | 
		
	
		
			
			| 291 |  | -				output.writeStartElement("tr");
 | 
		
	
		
			
			| 292 |  | -				for(var i = 0; i < seriesHeaders.length; i++) {
 | 
		
	
		
			
			| 293 |  | -					output.writeTextElement("th", seriesHeaders[i]);
 | 
		
	
		
			
			| 294 |  | -				}
 | 
		
	
		
			
			| 295 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 296 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 297 |  | -				buffer2.open(1);
 | 
		
	
		
			
			| 298 |  | -				var rq = 'for $t in doc($profile) //tuple return (string($t/time), ";", ';
 | 
		
	
		
			
			| 299 |  | -				for(var i = 0; i < seriesHeaders.length - 2; i++) {
 | 
		
	
		
			
			| 300 |  | -					rq = rq + 'string($t/temperature[' + Number(i+1) + ']), ";", ';
 | 
		
	
		
			
			| 301 |  | -				}
 | 
		
	
		
			
			| 302 |  | -				rq = rq + 'string($t/annotation), "~")';
 | 
		
	
		
			
			| 303 |  | -				colQuery.setQuery(rq);
 | 
		
	
		
			
			| 304 |  | -				var annotationData = colQuery.exec();
 | 
		
	
		
			
			| 305 |  | -				colQuery = colQuery.invalidate();
 | 
		
	
		
			
			| 306 |  | -				buffer2.close();
 | 
		
	
		
			
			| 307 |  | -				output.writeStartElement("tbody");
 | 
		
	
		
			
			| 308 |  | -				var annotationRecords = annotationData.split("~");
 | 
		
	
		
			
			| 309 |  | -				for(var i = 0; i < annotationRecords.length - 1; i++) {
 | 
		
	
		
			
			| 310 |  | -					output.writeStartElement("tr");
 | 
		
	
		
			
			| 311 |  | -					var annotationRow = annotationRecords[i].split(";");
 | 
		
	
		
			
			| 312 |  | -					for(var j = 0; j < annotationRow.length; j++) {
 | 
		
	
		
			
			| 313 |  | -						output.writeStartElement("td");
 | 
		
	
		
			
			| 314 |  | -						output.writeAttribute("style", "border-left: 1px solid #000000");
 | 
		
	
		
			
			| 315 |  | -						if(j > 0) {
 | 
		
	
		
			
			| 316 |  | -							output.writeAttribute("align", "center");
 | 
		
	
		
			
			| 317 |  | -						}
 | 
		
	
		
			
			| 318 |  | -						if(j > 0 && j < annotationRow.length - 1) {
 | 
		
	
		
			
			| 319 |  | -							output.writeCharacters(Number(annotationRow[j].replace(/^\s+|\s+$/g,"")).toFixed(2));
 | 
		
	
		
			
			| 320 |  | -						}
 | 
		
	
		
			
			| 321 |  | -						else {
 | 
		
	
		
			
			| 322 |  | -							output.writeCharacters(annotationRow[j].replace(/^\s+|\s+$/g,""));
 | 
		
	
		
			
			| 323 |  | -						}
 | 
		
	
		
			
			| 324 |  | -						output.writeEndElement();
 | 
		
	
		
			
			| 325 |  | -					}
 | 
		
	
		
			
			| 326 |  | -					output.writeEndElement();
 | 
		
	
		
			
			| 327 |  | -				}
 | 
		
	
		
			
			| 328 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 329 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 330 |  | -				output.writeCharacters(annotation);
 | 
		
	
		
			
			| 331 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 332 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 333 |  | -				output.writeEndElement();
 | 
		
	
		
			
			| 334 |  | -				output.writeEndDocument();
 | 
		
	
		
			
			| 335 |  | -				dataView.setContent(buffer);
 | 
		
	
		
			
			| 336 |  | -				buffer.close();
 | 
		
	
		
			
			| 337 |  | -				query = query.invalidate();
 | 
		
	
		
			
			| 338 |  | -				edit.enabled = true;
 | 
		
	
		
			
			| 339 |  | -			};
 | 
		
	
		
			
			| 340 |  | -			var saveMenu = findChildObject(this, 'save');
 | 
		
	
		
			
			| 341 |  | -			saveMenu.triggered.connect(function() {
 | 
		
	
		
			
			| 342 |  | -				var filename = QFileDialog.getSaveFileName(window, "Save Log As…", QSettings.value("script/lastDir", "") + "/");
 | 
		
	
		
			
			| 343 |  | -				if(filename != "") {
 | 
		
	
		
			
			| 344 |  | -					saveFileFromDatabase(fileID, filename);
 | 
		
	
		
			
			| 345 |  | -				}
 | 
		
	
		
			
			| 346 |  | -			});
 | 
		
	
		
			
			|  | 54 | +            });
 | 
		
	
		
			
			|  | 55 | +            target.clicked.connect(function() {
 | 
		
	
		
			
			|  | 56 | +                var query = new QSqlQuery;
 | 
		
	
		
			
			|  | 57 | +                query.prepare("SELECT file, name FROM files WHERE id = :id");
 | 
		
	
		
			
			|  | 58 | +                query.bind(":id", Number(fileID));
 | 
		
	
		
			
			|  | 59 | +                query.exec();
 | 
		
	
		
			
			|  | 60 | +                query.next();
 | 
		
	
		
			
			|  | 61 | +                var buffer = new QBuffer(query.value(0));
 | 
		
	
		
			
			|  | 62 | +                var pname = query.value(1);
 | 
		
	
		
			
			|  | 63 | +                query = query.invalidate();
 | 
		
	
		
			
			|  | 64 | +                var input = new XMLInput(buffer, 1);
 | 
		
	
		
			
			|  | 65 | +                var graph = findChildObject(Windows.loggingWindow, 'graph');
 | 
		
	
		
			
			|  | 66 | +                var log = findChildObject(Windows.loggingWindow, 'log');
 | 
		
	
		
			
			|  | 67 | +                log.clear();
 | 
		
	
		
			
			|  | 68 | +                graph.clear();
 | 
		
	
		
			
			|  | 69 | +                input.newTemperatureColumn.connect(log.setHeaderData);
 | 
		
	
		
			
			|  | 70 | +                input.newTemperatureColumn.connect(function(col, text) {
 | 
		
	
		
			
			|  | 71 | +                    if(text == Windows.loggingWindow.targetcolumnname) {
 | 
		
	
		
			
			|  | 72 | +                        targetseries = col;
 | 
		
	
		
			
			|  | 73 | +                    }
 | 
		
	
		
			
			|  | 74 | +                });
 | 
		
	
		
			
			|  | 75 | +                input.newAnnotationColumn.connect(log.setHeaderData);
 | 
		
	
		
			
			|  | 76 | +                input.measure.connect(graph.newMeasurement);
 | 
		
	
		
			
			|  | 77 | +                input.measure.connect(log.newMeasurement);
 | 
		
	
		
			
			|  | 78 | +                input.measure.connect(function(data, series) {
 | 
		
	
		
			
			|  | 79 | +                    if(series == targetseries) {
 | 
		
	
		
			
			|  | 80 | +                        targetDetector.newMeasurement(data);
 | 
		
	
		
			
			|  | 81 | +                    }
 | 
		
	
		
			
			|  | 82 | +                });
 | 
		
	
		
			
			|  | 83 | +                var lc;
 | 
		
	
		
			
			|  | 84 | +                input.lastColumn.connect(function(c) {
 | 
		
	
		
			
			|  | 85 | +                    lc = c;
 | 
		
	
		
			
			|  | 86 | +                    QSettings.setValue("liveColumn", c + 1);
 | 
		
	
		
			
			|  | 87 | +                    Windows.loggingWindow.postLoadColumnSetup(c);
 | 
		
	
		
			
			|  | 88 | +                });
 | 
		
	
		
			
			|  | 89 | +                input.annotation.connect(log.newAnnotation);
 | 
		
	
		
			
			|  | 90 | +                input.annotation.connect(function(note, tcol, ncol) {
 | 
		
	
		
			
			|  | 91 | +                    for(var i = tcol; i < ncol; i++) {
 | 
		
	
		
			
			|  | 92 | +                        log.newAnnotation(note, i, ncol);
 | 
		
	
		
			
			|  | 93 | +                    }
 | 
		
	
		
			
			|  | 94 | +                });
 | 
		
	
		
			
			|  | 95 | +                Windows.loggingWindow.windowTitle = "Typica - " + pname;
 | 
		
	
		
			
			|  | 96 | +                Windows.loggingWindow.raise();
 | 
		
	
		
			
			|  | 97 | +                Windows.loggingWindow.activateWindow();
 | 
		
	
		
			
			|  | 98 | +                input.input();
 | 
		
	
		
			
			|  | 99 | +                log.newAnnotation("End", 1, lc);
 | 
		
	
		
			
			|  | 100 | +                query = query.invalidate();
 | 
		
	
		
			
			|  | 101 | +            });
 | 
		
	
		
			
			|  | 102 | +            var viewbutton = findChildObject(this, 'viewprofile');
 | 
		
	
		
			
			|  | 103 | +            viewbutton.clicked.connect(function() {
 | 
		
	
		
			
			|  | 104 | +                var query = new QSqlQuery;
 | 
		
	
		
			
			|  | 105 | +                query.prepare("SELECT file, name FROM files WHERE id = :id");
 | 
		
	
		
			
			|  | 106 | +                query.bind(":id", Number(fileID));
 | 
		
	
		
			
			|  | 107 | +                query.exec();
 | 
		
	
		
			
			|  | 108 | +                if(query.next()) {
 | 
		
	
		
			
			|  | 109 | +                    var viewer = createWindow('offline');
 | 
		
	
		
			
			|  | 110 | +                    var buffer = new QBuffer(query.value(0));
 | 
		
	
		
			
			|  | 111 | +                    var pname = query.value(1);
 | 
		
	
		
			
			|  | 112 | +                    query = query.invalidate();
 | 
		
	
		
			
			|  | 113 | +                    var input = new XMLInput(buffer, 1);
 | 
		
	
		
			
			|  | 114 | +                    var graph = findChildObject(viewer, 'graph');
 | 
		
	
		
			
			|  | 115 | +                    var log = findChildObject(viewer, 'log');
 | 
		
	
		
			
			|  | 116 | +                    input.newTemperatureColumn.connect(log.setHeaderData);
 | 
		
	
		
			
			|  | 117 | +                    input.newTemperatureColumn.connect(function(column) {
 | 
		
	
		
			
			|  | 118 | +                        viewer.saveTemperatureColumns.push(column);
 | 
		
	
		
			
			|  | 119 | +                    });
 | 
		
	
		
			
			|  | 120 | +                    input.newAnnotationColumn.connect(log.setHeaderData);
 | 
		
	
		
			
			|  | 121 | +                    input.newAnnotationColumn.connect(function(column) {
 | 
		
	
		
			
			|  | 122 | +                        viewer.saveAnnotationColumns.push(column);
 | 
		
	
		
			
			|  | 123 | +                    });
 | 
		
	
		
			
			|  | 124 | +                    input.measure.connect(graph.newMeasurement);
 | 
		
	
		
			
			|  | 125 | +                    input.measure.connect(log.newMeasurement);
 | 
		
	
		
			
			|  | 126 | +                    input.annotation.connect(log.newAnnotation);
 | 
		
	
		
			
			|  | 127 | +                    var lc;
 | 
		
	
		
			
			|  | 128 | +                    input.lastColumn.connect(function(c) {
 | 
		
	
		
			
			|  | 129 | +                        lc = c;
 | 
		
	
		
			
			|  | 130 | +                        if(c < 3) {
 | 
		
	
		
			
			|  | 131 | +                            log.setHeaderData(3, "");
 | 
		
	
		
			
			|  | 132 | +                        }
 | 
		
	
		
			
			|  | 133 | +                    });
 | 
		
	
		
			
			|  | 134 | +                    input.annotation.connect(function(note, tcol, ncol) {
 | 
		
	
		
			
			|  | 135 | +                        for(var i = tcol; i < ncol; i++) {
 | 
		
	
		
			
			|  | 136 | +                            log.newAnnotation(note, i, ncol);
 | 
		
	
		
			
			|  | 137 | +                        }
 | 
		
	
		
			
			|  | 138 | +                    });
 | 
		
	
		
			
			|  | 139 | +                    viewer.windowTitle = "Typica - " + pname;
 | 
		
	
		
			
			|  | 140 | +                    viewer.raise();
 | 
		
	
		
			
			|  | 141 | +                    viewer.activateWindow();
 | 
		
	
		
			
			|  | 142 | +                    graph.updatesEnabled = false;
 | 
		
	
		
			
			|  | 143 | +                    log.updatesEnabled = false;
 | 
		
	
		
			
			|  | 144 | +                    input.input();
 | 
		
	
		
			
			|  | 145 | +                    log.updatesEnabled = true;
 | 
		
	
		
			
			|  | 146 | +                    graph.updatesEnabled = true;
 | 
		
	
		
			
			|  | 147 | +                    log.newAnnotation("End", 1, lc);
 | 
		
	
		
			
			|  | 148 | +                }
 | 
		
	
		
			
			|  | 149 | +                else {
 | 
		
	
		
			
			|  | 150 | +                    print("Query returned no results");
 | 
		
	
		
			
			|  | 151 | +                }
 | 
		
	
		
			
			|  | 152 | +                query = query.invalidate();
 | 
		
	
		
			
			|  | 153 | +            });
 | 
		
	
		
			
			|  | 154 | +            window.loadData = function(table, row) {
 | 
		
	
		
			
			|  | 155 | +                tableReference = table;
 | 
		
	
		
			
			|  | 156 | +                rowReference = row;
 | 
		
	
		
			
			|  | 157 | +                var buffer = new QBuffer;
 | 
		
	
		
			
			|  | 158 | +                buffer.open(3);
 | 
		
	
		
			
			|  | 159 | +                var output = new XmlWriter(buffer);
 | 
		
	
		
			
			|  | 160 | +                output.writeStartDocument("1.0");
 | 
		
	
		
			
			|  | 161 | +                output.writeDTD('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg.dtd">');
 | 
		
	
		
			
			|  | 162 | +                output.writeStartElement("html");
 | 
		
	
		
			
			|  | 163 | +                output.writeAttribute("xmlns", "http://www.w3.org/1999/xhtml");
 | 
		
	
		
			
			|  | 164 | +                output.writeStartElement("head");
 | 
		
	
		
			
			|  | 165 | +                output.writeTextElement("title", "Batch Details");
 | 
		
	
		
			
			|  | 166 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 167 | +                output.writeStartElement("body");
 | 
		
	
		
			
			|  | 168 | +                output.writeStartElement("div");
 | 
		
	
		
			
			|  | 169 | +                output.writeAttribute("style", "float: left; padding-right: 10px");
 | 
		
	
		
			
			|  | 170 | +                output.writeStartElement("p");
 | 
		
	
		
			
			|  | 171 | +                output.writeTextElement("strong", "Roasted Coffee: ");
 | 
		
	
		
			
			|  | 172 | +                output.writeTextElement("span", table.data(row, 2));
 | 
		
	
		
			
			|  | 173 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 174 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 175 | +                output.writeStartElement("div");
 | 
		
	
		
			
			|  | 176 | +                output.writeAttribute("style", "float: left");
 | 
		
	
		
			
			|  | 177 | +                output.writeStartElement("p");
 | 
		
	
		
			
			|  | 178 | +                output.writeTextElement("strong", "Roasted On: ");
 | 
		
	
		
			
			|  | 179 | +                batchTime = table.data(row, 0);
 | 
		
	
		
			
			|  | 180 | +                output.writeTextElement("span", batchTime);
 | 
		
	
		
			
			|  | 181 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 182 | +                output.writeStartElement("p");
 | 
		
	
		
			
			|  | 183 | +                output.writeTextElement("strong", "Batch Duration: ");
 | 
		
	
		
			
			|  | 184 | +                output.writeTextElement("span", table.data(row, 6));
 | 
		
	
		
			
			|  | 185 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 186 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 187 | +                output.writeStartElement("div");
 | 
		
	
		
			
			|  | 188 | +                output.writeAttribute("style", "clear: both");
 | 
		
	
		
			
			|  | 189 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 190 | +                output.writeStartElement("table");
 | 
		
	
		
			
			|  | 191 | +                output.writeStartElement("thead");
 | 
		
	
		
			
			|  | 192 | +                output.writeStartElement("tr");
 | 
		
	
		
			
			|  | 193 | +                output.writeTextElement("th", "Green Coffee");
 | 
		
	
		
			
			|  | 194 | +                output.writeTextElement("th", "Weight (lb)");
 | 
		
	
		
			
			|  | 195 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 196 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 197 | +                output.writeStartElement("tbody");
 | 
		
	
		
			
			|  | 198 | +                var query = new QSqlQuery();
 | 
		
	
		
			
			|  | 199 | +                query.prepare("SELECT unroasted_id, unroasted_quantity, approval, files, annotation, unroasted_total_quantity, roasted_quantity FROM roasting_log WHERE time = :time AND machine = :machine");
 | 
		
	
		
			
			|  | 200 | +                query.bind(":time", batchTime);
 | 
		
	
		
			
			|  | 201 | +                machine = table.data(row, 1);
 | 
		
	
		
			
			|  | 202 | +                query.bind(":machine", machine);
 | 
		
	
		
			
			|  | 203 | +                query.exec();
 | 
		
	
		
			
			|  | 204 | +                query.next();
 | 
		
	
		
			
			|  | 205 | +                approval = query.value(2);
 | 
		
	
		
			
			|  | 206 | +                annotation = query.value(4);
 | 
		
	
		
			
			|  | 207 | +                var items = sqlToArray(query.value(0));
 | 
		
	
		
			
			|  | 208 | +                var quantities = sqlToArray(query.value(1));
 | 
		
	
		
			
			|  | 209 | +                var nameQuery = new QSqlQuery();
 | 
		
	
		
			
			|  | 210 | +                nameQuery.prepare("SELECT name FROM items WHERE id = :id");
 | 
		
	
		
			
			|  | 211 | +                for(var i = 0; i < items.length; i++) {
 | 
		
	
		
			
			|  | 212 | +                    output.writeStartElement("tr");
 | 
		
	
		
			
			|  | 213 | +                    nameQuery.bind(":id", items[i]);
 | 
		
	
		
			
			|  | 214 | +                    nameQuery.exec();
 | 
		
	
		
			
			|  | 215 | +                    nameQuery.next();
 | 
		
	
		
			
			|  | 216 | +                    output.writeTextElement("td", nameQuery.value(0) + " (" + items[i] + ")");
 | 
		
	
		
			
			|  | 217 | +                    output.writeStartElement("td");
 | 
		
	
		
			
			|  | 218 | +                    output.writeAttribute("align", "center");
 | 
		
	
		
			
			|  | 219 | +                    output.writeCharacters(quantities[i]);
 | 
		
	
		
			
			|  | 220 | +                    output.writeEndElement();
 | 
		
	
		
			
			|  | 221 | +                    output.writeEndElement();
 | 
		
	
		
			
			|  | 222 | +                }
 | 
		
	
		
			
			|  | 223 | +                nameQuery = nameQuery.invalidate();
 | 
		
	
		
			
			|  | 224 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 225 | +                output.writeStartElement("tfoot");
 | 
		
	
		
			
			|  | 226 | +                output.writeStartElement("tr");
 | 
		
	
		
			
			|  | 227 | +                output.writeStartElement("td");
 | 
		
	
		
			
			|  | 228 | +                output.writeAttribute("align", "right");
 | 
		
	
		
			
			|  | 229 | +                output.writeTextElement("strong", "Green Total:");
 | 
		
	
		
			
			|  | 230 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 231 | +                output.writeStartElement("td");
 | 
		
	
		
			
			|  | 232 | +                output.writeAttribute("align", "center");
 | 
		
	
		
			
			|  | 233 | +                output.writeCharacters(query.value(5));
 | 
		
	
		
			
			|  | 234 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 235 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 236 | +                output.writeStartElement("tr");
 | 
		
	
		
			
			|  | 237 | +                output.writeStartElement("td");
 | 
		
	
		
			
			|  | 238 | +                output.writeAttribute("align", "right");
 | 
		
	
		
			
			|  | 239 | +                output.writeTextElement("strong", "Roasted Weight:");
 | 
		
	
		
			
			|  | 240 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 241 | +                output.writeStartElement("td");
 | 
		
	
		
			
			|  | 242 | +                output.writeAttribute("align", "center");
 | 
		
	
		
			
			|  | 243 | +                output.writeCharacters(query.value(6));
 | 
		
	
		
			
			|  | 244 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 245 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 246 | +                output.writeStartElement("tr");
 | 
		
	
		
			
			|  | 247 | +                output.writeStartElement("td");
 | 
		
	
		
			
			|  | 248 | +                output.writeAttribute("align", "right");
 | 
		
	
		
			
			|  | 249 | +                output.writeTextElement("strong", "Weight Loss:");
 | 
		
	
		
			
			|  | 250 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 251 | +                output.writeStartElement("td");
 | 
		
	
		
			
			|  | 252 | +                output.writeAttribute("align", "center");
 | 
		
	
		
			
			|  | 253 | +                output.writeCharacters(table.data(row, 5));
 | 
		
	
		
			
			|  | 254 | +                output.writeCharacters("%");
 | 
		
	
		
			
			|  | 255 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 256 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 257 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 258 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 259 | +                output.writeStartElement("p");
 | 
		
	
		
			
			|  | 260 | +                output.writeTextElement("strong", "Approved: ");
 | 
		
	
		
			
			|  | 261 | +                output.writeCharacters(approval);
 | 
		
	
		
			
			|  | 262 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 263 | +                output.writeStartElement("p");
 | 
		
	
		
			
			|  | 264 | +                output.writeTextElement("strong", "Files: ");
 | 
		
	
		
			
			|  | 265 | +                output.writeCharacters(query.value(3));
 | 
		
	
		
			
			|  | 266 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 267 | +                output.writeStartElement("p");
 | 
		
	
		
			
			|  | 268 | +                output.writeTextElement("strong", "Annotations:");
 | 
		
	
		
			
			|  | 269 | +                var files = sqlToArray(query.value(3));
 | 
		
	
		
			
			|  | 270 | +                var annotations = annotationFromRecord(files[0]);
 | 
		
	
		
			
			|  | 271 | +                fileID = files[0];
 | 
		
	
		
			
			|  | 272 | +                var buffer2 = new QBuffer("<points>"+annotations+"</points>");
 | 
		
	
		
			
			|  | 273 | +                buffer2.open(1);
 | 
		
	
		
			
			|  | 274 | +                var colQuery = new XQuery;
 | 
		
	
		
			
			|  | 275 | +                colQuery.bind("profile", buffer2);
 | 
		
	
		
			
			|  | 276 | +                colQuery.setQuery('for $i in doc($profile)//tuple[1]/temperature/@series return (string($i), ";")');
 | 
		
	
		
			
			|  | 277 | +                var result = colQuery.exec();
 | 
		
	
		
			
			|  | 278 | +                buffer2.close();
 | 
		
	
		
			
			|  | 279 | +                var seriesHeaders = new Array();
 | 
		
	
		
			
			|  | 280 | +                seriesHeaders.push("Time");
 | 
		
	
		
			
			|  | 281 | +                var records = result.split(";");
 | 
		
	
		
			
			|  | 282 | +                for(var i = 0; i < records.length - 1; i++) {
 | 
		
	
		
			
			|  | 283 | +                    seriesHeaders.push(records[i].replace(/^\s+|\s+$/g,""));
 | 
		
	
		
			
			|  | 284 | +                }
 | 
		
	
		
			
			|  | 285 | +                seriesHeaders.push("Note");
 | 
		
	
		
			
			|  | 286 | +                output.writeStartElement("table");
 | 
		
	
		
			
			|  | 287 | +                output.writeStartElement("thead");
 | 
		
	
		
			
			|  | 288 | +                output.writeStartElement("tr");
 | 
		
	
		
			
			|  | 289 | +                for(var i = 0; i < seriesHeaders.length; i++) {
 | 
		
	
		
			
			|  | 290 | +                        output.writeTextElement("th", seriesHeaders[i]);
 | 
		
	
		
			
			|  | 291 | +                }
 | 
		
	
		
			
			|  | 292 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 293 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 294 | +                buffer2.open(1);
 | 
		
	
		
			
			|  | 295 | +                var rq = 'for $t in doc($profile) //tuple return (string($t/time), ";", ';
 | 
		
	
		
			
			|  | 296 | +                for(var i = 0; i < seriesHeaders.length - 2; i++) {
 | 
		
	
		
			
			|  | 297 | +                        rq = rq + 'string($t/temperature[' + Number(i+1) + ']), ";", ';
 | 
		
	
		
			
			|  | 298 | +                }
 | 
		
	
		
			
			|  | 299 | +                rq = rq + 'string($t/annotation), "~")';
 | 
		
	
		
			
			|  | 300 | +                colQuery.setQuery(rq);
 | 
		
	
		
			
			|  | 301 | +                var annotationData = colQuery.exec();
 | 
		
	
		
			
			|  | 302 | +                colQuery = colQuery.invalidate();
 | 
		
	
		
			
			|  | 303 | +                buffer2.close();
 | 
		
	
		
			
			|  | 304 | +                output.writeStartElement("tbody");
 | 
		
	
		
			
			|  | 305 | +                var annotationRecords = annotationData.split("~");
 | 
		
	
		
			
			|  | 306 | +                for(var i = 0; i < annotationRecords.length - 1; i++) {
 | 
		
	
		
			
			|  | 307 | +                    output.writeStartElement("tr");
 | 
		
	
		
			
			|  | 308 | +                    var annotationRow = annotationRecords[i].split(";");
 | 
		
	
		
			
			|  | 309 | +                    for(var j = 0; j < annotationRow.length; j++) {
 | 
		
	
		
			
			|  | 310 | +                        output.writeStartElement("td");
 | 
		
	
		
			
			|  | 311 | +                        output.writeAttribute("style", "border-left: 1px solid #000000");
 | 
		
	
		
			
			|  | 312 | +                        if(j > 0) {
 | 
		
	
		
			
			|  | 313 | +                            output.writeAttribute("align", "center");
 | 
		
	
		
			
			|  | 314 | +                        }
 | 
		
	
		
			
			|  | 315 | +                        if(j > 0 && j < annotationRow.length - 1) {
 | 
		
	
		
			
			|  | 316 | +                            output.writeCharacters(Number(annotationRow[j].replace(/^\s+|\s+$/g,"")).toFixed(2));
 | 
		
	
		
			
			|  | 317 | +                        }
 | 
		
	
		
			
			|  | 318 | +                        else {
 | 
		
	
		
			
			|  | 319 | +                            output.writeCharacters(annotationRow[j].replace(/^\s+|\s+$/g,""));
 | 
		
	
		
			
			|  | 320 | +                        }
 | 
		
	
		
			
			|  | 321 | +                        output.writeEndElement();
 | 
		
	
		
			
			|  | 322 | +                    }
 | 
		
	
		
			
			|  | 323 | +                    output.writeEndElement();
 | 
		
	
		
			
			|  | 324 | +                }
 | 
		
	
		
			
			|  | 325 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 326 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 327 | +                output.writeCharacters(annotation);
 | 
		
	
		
			
			|  | 328 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 329 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 330 | +                output.writeEndElement();
 | 
		
	
		
			
			|  | 331 | +                output.writeEndDocument();
 | 
		
	
		
			
			|  | 332 | +                dataView.setContent(buffer);
 | 
		
	
		
			
			|  | 333 | +                buffer.close();
 | 
		
	
		
			
			|  | 334 | +                query = query.invalidate();
 | 
		
	
		
			
			|  | 335 | +                edit.enabled = true;
 | 
		
	
		
			
			|  | 336 | +            };
 | 
		
	
		
			
			|  | 337 | +            var saveMenu = findChildObject(this, 'save');
 | 
		
	
		
			
			|  | 338 | +            saveMenu.triggered.connect(function() {
 | 
		
	
		
			
			|  | 339 | +                var filename = QFileDialog.getSaveFileName(window, "Save Log As…", QSettings.value("script/lastDir", "") + "/");
 | 
		
	
		
			
			|  | 340 | +                if(filename != "") {
 | 
		
	
		
			
			|  | 341 | +                    saveFileFromDatabase(fileID, filename);
 | 
		
	
		
			
			|  | 342 | +                }
 | 
		
	
		
			
			|  | 343 | +            });
 | 
		
	
		
			
			| 347 | 344 |          ]]>
 | 
		
	
		
			
			| 348 | 345 |      </program>
 | 
		
	
		
			
			| 349 | 346 |  </window>
 |