soil-analysis.php 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645
  1. <?php
  2. /**
  3. * dashboard/crop-analysis/soil-analysis.php
  4. *
  5. * Soil Analysis Results Display Page
  6. * Shows detailed soil test results with calculations and recommendations
  7. */
  8. require_once __DIR__.'/../../config/database.php';
  9. require_once __DIR__.'/../../lib/auth.php';
  10. require_once __DIR__.'/../../lib/validation.php';
  11. // Start session if not already started
  12. if (session_status() === PHP_SESSION_NONE) {
  13. session_start();
  14. }
  15. // Require authentication
  16. requireLogin();
  17. // Get and validate parameters
  18. $client_id = (int)($_GET['cid'] ?? 0);
  19. $record_id = (float)($_GET['rid'] ?? 0);
  20. $rand_id = (float)($_GET['rand'] ?? 0);
  21. // Validate required parameters
  22. if (!$record_id || !$rand_id) {
  23. die('Invalid request parameters');
  24. }
  25. // Get soil record data securely
  26. try {
  27. $pdo = getDBConnection();
  28. $stmt = $pdo->prepare("SELECT * FROM soil_records WHERE id = ? AND rand = ?");
  29. $stmt->execute([$record_id, $rand_id]);
  30. $row = $stmt->fetch(PDO::FETCH_ASSOC);
  31. if (!$row) {
  32. die('Soil record not found');
  33. }
  34. // Extract data
  35. $client = htmlspecialchars($row['client_name'] ?? '', ENT_QUOTES, 'UTF-8');
  36. $address = htmlspecialchars($row['site_address'] ?? '', ENT_QUOTES, 'UTF-8');
  37. $state = htmlspecialchars($row['state_postcode'] ?? '', ENT_QUOTES, 'UTF-8');
  38. $email = htmlspecialchars($row['email'] ?? '', ENT_QUOTES, 'UTF-8');
  39. $labNo = htmlspecialchars($row['lab_no'] ?? '', ENT_QUOTES, 'UTF-8');
  40. $sampleDate = htmlspecialchars($row['date_sampled'] ?? '', ENT_QUOTES, 'UTF-8');
  41. $sample = htmlspecialchars($row['site_id'] ?? '', ENT_QUOTES, 'UTF-8');
  42. $crop = htmlspecialchars($row['sample_id'] ?? '', ENT_QUOTES, 'UTF-8');
  43. } catch (PDOException $e) {
  44. error_log("Database error in soil-analysis.php: " . $e->getMessage());
  45. die('Database error occurred');
  46. }
  47. $today = date('jS F Y');
  48. $pageTitle = 'Soil Analysis Results - ' . $client;
  49. ?>
  50. <!doctype html>
  51. <html lang="en">
  52. <head>
  53. <title><?php echo $pageTitle; ?> | Crop Management Platform</title>
  54. <base href="/" >
  55. <meta charset="utf-8" >
  56. <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" >
  57. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" >
  58. <meta name="keywords" content="soil analysis, crop monitoring, agriculture" >
  59. <meta name="description" content="Detailed soil analysis results and recommendations" >
  60. <link rel="icon" href="client-assets/images/favicon.ico?v=2" type="image/x-icon" >
  61. <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
  62. <!-- Bootstrap 5 CSS -->
  63. <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-KyZXEAg3QhqLMpG8r+8fhAXLRk2vvoC2f3B09zVXn8CA5QIVfZOJ3BCsw2P0p/We" crossorigin="anonymous">
  64. <link href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css" rel="stylesheet" type="text/css" />
  65. <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" integrity="sha512-9usAa10IRO0HhonpyAIVpjrylPvoDwiPUiKdWk5t3PyolY1cOd4DSE0Ga+ri4AuTroPR5aQvXU9xC6qOPnzFeg==" crossorigin="anonymous" referrerpolicy="no-referrer" rel="stylesheet" type="text/css" />
  66. <link type="text/css" href="/client-assets/weather-icons/css/weather-icons.min.css?version=1.16" rel="stylesheet" type="text/css" />
  67. <link href="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/magnific-popup.css" rel="stylesheet" type="text/css" />
  68. <script src="https://unpkg.com/gijgo@1.9.11/js/gijgo.min.js" type="text/javascript"></script>
  69. <link href="https://unpkg.com/gijgo@1.9.11/css/gijgo.min.css" rel="stylesheet" type="text/css" />
  70. <script src="client-assets/js/skycons.js" type="text/javascript"></script>
  71. <link href="client-assets/home/css/graphing.css" rel="stylesheet" type="text/css" media="screen" />
  72. <link href="client-assets/home/css/alux.min.css" rel="stylesheet" type="text/css" media="screen" />
  73. <script src="https://cdnjs.cloudflare.com/ajax/libs/html2pdf.js/0.9.3/html2pdf.bundle.min.js" integrity="sha512-YcsIPGdhPK4P/uRW6/sruonlYj+Q7UHWeKfTAkBW+g83NKM+jMJFJ4iAPfSnVp7BKD4dKMHmVSvICUbE/V1sSw==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
  74. <style>
  75. @media print {
  76. @page {
  77. size: A4 portrait;
  78. }
  79. @page :left {
  80. margin-left: 0.5cm;
  81. }
  82. @page :right {
  83. margin-right: 0.5cm;
  84. }
  85. @page :top {
  86. margin-top: 0cm;
  87. }
  88. @page :bottom {
  89. margin-bottom: 0cm;
  90. }
  91. }
  92. </style>
  93. </head>
  94. <body>
  95. <div class="container">
  96. <div class="row">
  97. <?php
  98. // Replace Logo with Customer Logo if supplied.
  99. $client = '';
  100. echo "<div class='col-md-3'>";
  101. if ($client === "") {
  102. echo "<img class='img-fluid' src='client-assets/images/crop-monitor.png' alt='Crop Monitor' >";
  103. } else {
  104. echo "<img class='img-fluid' src='client-assets/images/crop-monitor.png' alt='Crop Monitor' >";
  105. }
  106. //echo "<span class='col'></span>";
  107. //Client Test Description
  108. if ($client === "") {
  109. echo "";
  110. } else {
  111. echo "<img class='img-fluid' src='client-assets/images/crop-monitor.png' alt='Crop Monitor' >";
  112. }
  113. echo "</div>";
  114. echo "<div class='col-md-9'></div>";
  115. ?>
  116. </div>
  117. <table class='title'>
  118. <tbody>
  119. <tr>
  120. <th class='col-20'></th>
  121. <th class='col-20'></th>
  122. <th class='col-20'></th>
  123. <th class='col-20'></th>
  124. <th class='col-20'></th>
  125. </tr>
  126. <tr>
  127. <td class='right'><b>DATE:</b></td>
  128. <td class='left'><?php echo $today; ?></td>
  129. <td></td>
  130. <td class='right'><b>SAMPLE ID:</b></td>
  131. <td class='left'><?php echo $sample; ?></td>
  132. </tr>
  133. <tr>
  134. <td class='right'><b>CLIENT:</b></td>
  135. <td class='left'><?php echo $client; ?></td>
  136. <td></td>
  137. <td class='right'><b>DATE SAMPLED:</b></td>
  138. <td class='left'><?php echo $sampleDate; ?></td>
  139. </tr>
  140. <tr>
  141. <td class='right'><b>ADDRESS:</b></td>
  142. <td class='left'><?php echo $address; ?></td>
  143. <td></td>
  144. <td class='right'><b>LAB NUMBER:</b></td>
  145. <td class='left'><?php echo $labNo; ?></td>
  146. </tr>
  147. <tr>
  148. <td class='right'><b> </b></td>
  149. <td class='left'><?php echo $state; ?></td>
  150. <td></td>
  151. <td class='right'><b>CROP:</b></td>
  152. <td class='left'><?php echo $crop; ?></td>
  153. </tr>
  154. <tr>
  155. <td class='right'><b> </b></td>
  156. <td class='left'><?php echo $email; ?></td>
  157. <td></td>
  158. <td class='right'></td>
  159. <td class='left'></td>
  160. </tr>
  161. </tbody>
  162. </table>
  163. <!-- Graph Button -->
  164. <div class="d-print-none">
  165. <div class="row p-2">
  166. <div class="col">
  167. <button type="button" class="btn btn-primary" onclick="generateGraph()">
  168. <i class="fas fa-chart-bar"></i> Generate Graph
  169. </button>
  170. </div>
  171. <div class="col">
  172. <div class="form-status-holder"></div>
  173. </div>
  174. </div>
  175. </div>
  176. <!-- GRAPH BANNER -->
  177. <div class="row">
  178. <div class="col-md-12 text-center font-weight-bold h4">Soil Analysis Summary</div>
  179. </div>
  180. <!-- CHART HEADER -->
  181. <div class="row bg-dark text-white p-2 mt-3">
  182. <div class="text-center col-md-12 h5">Total kilograms per hectare of each element needed to balance soil in this test</div>
  183. </div>
  184. <div class="row">
  185. <div class="">
  186. <?php
  187. require_once __DIR__.'/../../lib/soil_calculations.php';
  188. echo soilAnalysisReportCalcs('Ca', 'BS_ca_ppm', 'ca_ppm_min', 'ca_ppm_max', 'Calcium', 'kg', 'col', $record_id, $rand_id);
  189. echo soilAnalysisReportCalcs('Mg', 'BS_mg_ppm', 'mg_ppm_min', 'mg_ppm_max', 'Magnesium', 'kg', 'col', $record_id, $rand_id);
  190. echo soilAnalysisReportCalcs('K', 'BS_k_ppm', 'k_ppm_min', 'k_ppm_max', 'Potasium', 'kg', 'col', $record_id, $rand_id);
  191. echo soilAnalysisReportCalcs('Na', 'BS_na_ppm', 'na_ppm_min', 'na_ppm_max', 'Sodium', 'kg', 'col', $record_id, $rand_id);
  192. echo soilAnalysisReportCalcs('P', 'p_colwell', '', '', 'Phosphate', 'kg', 'col', $record_id, $rand_id);
  193. echo soilAnalysisReportCalcs('S', 's_morgan', '', '', 'Sulfur', 'kg', 'col', $record_id, $rand_id);
  194. echo soilAnalysisReportCalcs('Mn', 'mn_dtpa', '', '', 'Manganese', 'kg', 'col', $record_id, $rand_id);
  195. echo soilAnalysisReportCalcs('Fe', 'fe_dtpa', '', '', 'Iron', 'kg', 'col', $record_id, $rand_id);
  196. echo soilAnalysisReportCalcs('Zn', 'zn_dtpa', '', '', 'Zinc', 'kg', 'col', $record_id, $rand_id);
  197. echo soilAnalysisReportCalcs('Cu', 'cu_dtpa', '', '', 'Copper', 'kg', 'col', $record_id, $rand_id);
  198. echo soilAnalysisReportCalcs('AmN', 'NH3_N', '', '', 'AmNitrogen', 'kg', 'col', $record_id, $rand_id);
  199. echo soilAnalysisReportCalcs('B', 'b_cacl2', '', '', 'Boron', 'kg', 'col', $record_id, $rand_id);
  200. echo soilAnalysisReportCalcs('NN', 'NO3_N', '', '', 'NNitrogen', 'kg', 'col', $record_id, $rand_id);
  201. ?>
  202. </div>
  203. </div>
  204. <hr>
  205. <!-- **************** START OF FORM DATA **************** -->
  206. <form class="report-form" method="post">
  207. <input type="hidden" name="record_id" value="<?php echo htmlspecialchars($record_id, ENT_QUOTES, 'UTF-8'); ?>">
  208. <input type="hidden" name="rand_id" value="<?php echo htmlspecialchars($rand_id, ENT_QUOTES, 'UTF-8'); ?>">
  209. <!-- **************** OVERVIEW SECTION **************** -->
  210. <div class="row bg-dark text-white p-2 mt-3">
  211. <div class="text-center col-md-12 h5 ">Overview</div>
  212. </div>
  213. <div class="row">
  214. <div class="col-md-12 p-0" >
  215. <textarea class="form-control rounded-0" rows="5" id="overview" name="overview" ></textarea>
  216. </div>
  217. </div>
  218. <hr>
  219. <div class="row bg-dark text-white p-2 mt-3">
  220. <div class="text-center col-md-12 h5 ">Ideal Soil Balancing Program for One Season of a FIVE YEAR Plan</div>
  221. </div>
  222. <div class="">
  223. <?php
  224. // Generate 5-year soil balancing program
  225. for ($year = 1; $year <= 5; $year++) {
  226. echo soilProgramCalcs('Ca', 'BS_ca_ppm', 'ca_ppm_min', 'ca_ppm_max', 'Calcium', 'kg', $record_id, $rand_id);
  227. }
  228. ?>
  229. </div>
  230. <hr>
  231. <!-- **************** FOLIAR PROGRAM SECTION **************** -->
  232. <div class="row bg-dark text-white p-2 mt-3">
  233. <div class="text-center col-md-12 h5" ><input type="text" class="text-center form-control-plaintext text-white border-dark bg-dark" name="header1" id="header1" value="Foliar Program"></div>
  234. </div>
  235. <div class="row">
  236. <div class="col-md-12 p-0" >
  237. <textarea class="form-control rounded-0" rows="5" id="foliar_Details" name="foliar_Details"></textarea>
  238. </div>
  239. </div>
  240. <!-- **************** MICROBE PROGRAM SECTION **************** -->
  241. <div class="row bg-dark text-white p-2 mt-3">
  242. <div class="text-center col-md-12 h5">Microbe Program</div>
  243. </div>
  244. <div class="row">
  245. <div class="col-md-12 p-0" >
  246. <textarea class="form-control rounded-0" rows="5" id="microbe_Program" name="microbe_Program" ></textarea>
  247. </div>
  248. </div>
  249. <div class="row">
  250. <p style="font-style: italic; font-size: 9px;">Any recommendations provided by Cropmonitor are advice only, We are not paid consultants and we are not covered to accept responsibiliy for any of our suggestions. As no control can be exercised over storage, handling, mixing application or use, or weather, plant or soil conditions before, during or after application (all of which may affect the preformance of our program), no responsibility for, or liability for any failure in performance, losses, damage or injuries consequential or otherwise, arisiing form such storage mixng application or use will be accepted under any circumstances whatsoever. The buyer assumes all responsibility for the use of any of our products.</p>
  251. </div>
  252. </form>
  253. </div>
  254. <script type="text/javascript">
  255. $(document).ready(function(){
  256. var timeoutId;
  257. $('form textarea, form input').on('input propertychange change', function() {
  258. console.log('Textarea Change');
  259. clearTimeout(timeoutId);
  260. timeoutId = setTimeout(function() {
  261. // Runs 1 second (1000 ms) after the last change
  262. saveToDB();
  263. }, 1000);
  264. });
  265. function saveToDB() {
  266. console.log('Saving to the db');
  267. form = $('.report-form');
  268. $.ajax({
  269. url: "/controllers/save_soil_analysis.php",
  270. type: "POST",
  271. data: form.serialize(), // serializes the form's elements.
  272. beforeSend: function(xhr) {
  273. // Let them know we are saving
  274. $('.form-status-holder').html('Saving...');
  275. },
  276. success: function(data) {
  277. var jqObj = jQuery(data); // You can get data returned from your ajax call here. ex. jqObj.find('.returned-data').html()
  278. // Now show them we saved and when we did
  279. var d = new Date();
  280. $('.form-status-holder').html('Saved! Last: ' + d.toLocaleTimeString());
  281. },
  282. });
  283. }
  284. // This is just so we don't go anywhere
  285. // and still save if you submit the form
  286. $('.report-form').submit(function(e) {
  287. saveToDB();
  288. e.preventDefault();
  289. });
  290. });
  291. </script>
  292. </div>
  293. <!--
  294. <script src="https://cloud.tinymce.com/stable/tinymce.min.js?apiKey=xcotawi18mg1imp8im144buq68h9g3ndd3c9c8215w8qu3ld"></script>
  295. <script>
  296. tinymce.init({
  297. selector: 'textarea',
  298. menubar: false,
  299. toolbar: 'bold italic | alignleft aligncenter alignright alignjustify | bullist numlist | removeformat',
  300. plugins: 'autosave',
  301. autosave_interval: '20s'
  302. });
  303. </script>
  304. -->
  305. <!-- jQuery first, then Popper.js, then Bootstrap JS -->
  306. <script type="text/javascript" src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script>
  307. <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.3/dist/umd/popper.min.js" integrity="sha384-eMNCOe7tC1doHpGoWe/6oMVZahOyBRvxQxkjVwPtGPRwO3dRnJgOyR5MwCOgxqA==" crossorigin="anonymous"></script>
  308. <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>
  309. <script type="text/javascript">
  310. addEventListener("load", function() {
  311. setTimeout(hideURLbar, 0);
  312. }, false);
  313. function hideURLbar(){
  314. window.scrollTo(0,1);
  315. }
  316. </script>
  317. <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.js"></script>
  318. <script src="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/jquery.magnific-popup.js"></script>
  319. <script>
  320. function generateGraph() {
  321. alert('Graph generation functionality will be implemented here.');
  322. }
  323. </script>
  324. <script>
  325. //https://github.com/eKoopmans/html2pdf.js
  326. $('.downloadPDF').click(function () {
  327. var element = document.getElementById('content'); //document.createElement("body");
  328. element.classList.remove('screen');
  329. element.classList.add('print');
  330. var opt = {
  331. margin: 3,
  332. filename: 'soil-analysis.pdf',
  333. image: { type: 'jpeg', quality: 1.0 },
  334. html2canvas: { scale: 2, letterRendering: true, windowWidth: 1024 }, //, windowWidth: 1024
  335. jsPDF: { orientation: 'portrait', unit: 'mm', format: 'a4', putOnlyUsedFonts: true, floatPrecision: 'smart', }
  336. };
  337. html2pdf()
  338. .from(element)
  339. .toPdf()
  340. .set(opt)
  341. .save()
  342. .then(function(){
  343. element.classList.remove('print');
  344. element.classList.add('screen');
  345. });
  346. });
  347. </script>
  348. </body>
  349. </html>
  350. <link rel="stylesheet" href="client-assets/home/css/graphPrint.css" media="print">
  351. <style>
  352. .progress {
  353. border-radius: 0rem !important;
  354. }
  355. </style>
  356. <div class="container" id="content">
  357. <div class="row">
  358. [[!logoHeader]]
  359. </div>
  360. [[!soilAnalysisClient]]
  361. <!-- Graph Button -->
  362. <div class="d-print-none">
  363. [[!soilAnalysisReportButton]]
  364. <!-- <button class="btn btn-secondary downloadPDF" >Generate PDF</button> -->
  365. </div>
  366. <!-- GRAPH BANNER -->
  367. <div class="row">
  368. <div class="col-md-12 text-center font-weight-bold h4" >ANALYSIS RESULTS</div>
  369. </div>
  370. <hr class="p-1 m-1">
  371. <!-- CHART HEADER -->
  372. <table class="chart">
  373. <tbody>
  374. <tr class="chart-header">
  375. <th colspan=3 class="text-center col-md-6 border-left border-right border-top">ELEMENT</th>
  376. <th colspan=3 class="text-center col-md-6 border-right border-top">STATUS</th>
  377. </tr>
  378. <tr class="chart-header-sub">
  379. <th class="text-center col-18 border-left"></th>
  380. <th class="text-center col-15">DESIRED</th>
  381. <th class="text-center col-15">FOUND</th>
  382. <th class="text-center col-16 stripe-1">LIGHT</th>
  383. <th class="text-center col-16 stripe-1">MEDIUM</th>
  384. <th class="text-center col-16 border-right stripe-1">HEAVY</th>
  385. </tr>
  386. <tr>
  387. <td class="border-left"></td>
  388. <td class="border-left"></td>
  389. <td class="border-left nutrient-balance"></td>
  390. <td class="border-left"></td>
  391. <td class="border-left"></td>
  392. <td class="border-left border-right"></td>
  393. </tr>
  394. [[!soilAnalysisCalcs? &element=cec &sbl=`` &nutrient=`CEC` &min=`` &max=`` &text=`` &recV=`n` &decimal=`2` &graph=lightorangeGraph]]
  395. [[!soilAnalysisCalcs? &element=tec &sbl=`` &nutrient=`TEC` &min=`` &max=`soil_type` &text=`` &recV=`max` &rec_text=`c` &decimal=`2` &graph=lightorangeGraph]]
  396. <tr class="chart-header-sub">
  397. <th class="text-center col-18 border-left text-dark bg-white"></th>
  398. <th class="text-center col-15 border-left text-dark bg-white"></th>
  399. <th class="text-center col-15 border-left nutrient-balance"></th>
  400. <th class="text-center col-16 border-left stripe-1">DEFICIT</th>
  401. <th class="text-center col-16 stripe-1">IDEAL</th>
  402. <th class="text-center col-16 border-right stripe-1">HIGH</th>
  403. </tr>
  404. [[!soilAnalysisCalcs? &element=ph_h2o &sbl=`` &nutrient=`pH-level (H20)` &type=`pH` &min=`` &max=`` &text=`` &recV=`ph` &decimal=`1` &graph=lightorangeGraph]]
  405. [[!soilAnalysisCalcs? &element=ph_cacl2 &sbl=`` &nutrient=`pH-level (CaCl2)` &type=`pH` &min=`` &max=`` &text=`` &recV=`n` &decimal=`1` &graph=lightorangeGraph]]
  406. [[!soilAnalysisCalcs? &element=ec &sbl=`` &nutrient=`Conductivity (EC)` &type=`mS/cm` &min=`` &max=`` &text=`` &decimal=`2` &graph=lightorangeGraph]]
  407. [[!soilAnalysisCalcs? &element=ocarbon &sbl=`` &nutrient=`Organic Carbon` &type=`%` &min=`` &max=`` &text=`` &decimal=`1` &graph=lightorangeGraph]]
  408. [[!soilAnalysisCalcs? &element=omatter &sbl=`` &nutrient=`Organic Matter` &type=`%` &min=`` &max=`` &text=`` &decimal=`1` &graph=lightorangeGraph]]
  409. <tr class="chart-header-sub">
  410. <th colspan=3 class="col-16 border-left text-center lightgreen">MAJOR ELEMENTS</th>
  411. <th class="text-center col-16 stripe-1"></th>
  412. <th class="text-center col-16 stripe-1"></th>
  413. <th class="text-center col-16 border-right stripe-1"></th>
  414. </tr>
  415. [[!soilAnalysisCalcs? &element=`NO3_N` &sbl=`NO<sub>3</sub>-N` &nutrient=`Nitrate <small class="d-print-none">Nitrogen</small>` &min=`10` &max=`20` &type=ppm &text=`c` &rec_text=`r` &decimal=`0` &graph=lightgreenGraph]]
  416. [[!soilAnalysisCalcs? &element=`NH3_N` &sbl=`NH<sub>3</sub>-N` &nutrient=`Ammonium <small class="d-print-none">Nitrogen</small>` &min=`` &max=`` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`0` &graph=lightgreenGraph]]
  417. <!-- [!soilAnalysisCalcs? &element=`p_mehlick` &sbl=`P` &nutrient=`Phosphorus <small>(mehlick III)</small>` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`0` &graph=lightgreenGraph]]
  418. [!soilAnalysisCalcs? &element=`p_bray2` &sbl=`P` &nutrient=`Phosphorus <small>(Bray 2)</small>` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`0` &graph=lightgreenGraph]]
  419. [!soilAnalysisCalcs? &element=`p_morgan` &sbl=`P` &nutrient=`Phosphate <small>(morgan)</small>` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`0` &graph=lightgreenGraph]] -->
  420. [[!soilAnalysisCalcs? &element=`p_colwell` &sbl=`P` &nutrient=`Phosphate <small>(colwell)</small>` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`0` &graph=lightgreenGraph]]
  421. [[!soilAnalysisCalcs? &element=`BS_ca_ppm` &sbl=`Ca` &nutrient=`Calcium` &min=`ca_ppm_min` &max=`ca_ppm_max` &type=`ppm` &text=`c` &rec_text=`r` &recV=`max` &decimal=`0` &graph=lightgreenGraph]]
  422. [[!soilAnalysisCalcs? &element=`BS_mg_ppm` &sbl=`Mg` &nutrient=`Magnesium` &min=`mg_ppm_min` &max=`mg_ppm_max` &type=`ppm` &text=`c` &rec_text=`r` &recV=`max` &decimal=`0` &graph=lightgreenGraph]]
  423. [[!soilAnalysisCalcs? &element=`BS_k_ppm` &sbl=`K` &nutrient=`Potassium` &min=`k_ppm_min` &max=`k_ppm_max` &type=`ppm` &text=`c` &rec_text=`r` &recV=`max` &decimal=`0` &graph=lightgreenGraph]]
  424. [[!soilAnalysisCalcs? &element=`BS_na_ppm` &sbl=`Na` &nutrient=`Sodium` &min=`na_ppm_min` &max=`na_ppm_max` &type=`ppm` &text=`c` &rec_text=`r` &recV=`max` &decimal=`0` &graph=lightgreenGraph]]
  425. <tr class="chart-header-sub">
  426. <th colspan=3 class="col-16 border-left text-center lightred">TRACE ELEMENTS</th>
  427. <th class="text-center col-16 stripe-1"></th>
  428. <th class="text-center col-16 stripe-1"></th>
  429. <th class="text-center col-16 border-right stripe-1"></th>
  430. </tr>
  431. [[!soilAnalysisCalcs? &element=s_morgan &sbl=`S` &nutrient=`Sulfur` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`2` &graph=lightredGraph]]
  432. [[!soilAnalysisCalcs? &element=b_cacl2 &sbl=`B` &nutrient=`Boron` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`2` &graph=lightredGraph]]
  433. [[!soilAnalysisCalcs? &element=mn_dtpa &sbl=`Mn` &nutrient=`Manganese` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`2` &graph=lightredGraph]]
  434. [[!soilAnalysisCalcs? &element=cu_dtpa &sbl=`Cu` &nutrient=`Copper` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`2` &graph=lightredGraph]]
  435. [[!soilAnalysisCalcs? &element=zn_dtpa &sbl=`Zn` &nutrient=`Zinc` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`2` &graph=lightredGraph]]
  436. [[!soilAnalysisCalcs? &element=fe_dtpa &sbl=`Ir` &nutrient=`Iron` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`2` &graph=lightredGraph]]
  437. [[!soilAnalysisCalcs? &element=al &sbl=`Al` &nutrient=`Aluminium` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`2` &graph=lightredGraph]]
  438. [[!soilAnalysisCalcs? &element=sl_cacl2 &sbl=`Si` &nutrient=`Silicon` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`2` &graph=lightredGraph]]
  439. <tr class="chart-header-sub">
  440. <th colspan=3 class="col-16 border-left text-center lightpurple">BASE SATURATION</th>
  441. <th class="text-center col-16 stripe-1"></th>
  442. <th class="text-center col-16 stripe-1"></th>
  443. <th class="text-center col-16 border-right stripe-1"></th>
  444. </tr>
  445. [[!soilAnalysisCalcs? &element=`BS_ca2` &sbl=`Ca` &nutrient=`Calcium` &min=`cabs_min` &max=`cabs_max` &type=`%` &text=`c` &rec_text=`r` &recV=`max` &decimal=`2` &graph=lightpurpleGraph]]
  446. [[!soilAnalysisCalcs? &element=`BS_mg2` &sbl=`Mg` &nutrient=`Magnesium` &min=`mgbs_min` &max=`mgbs_max` &type=`%` &text=`c` &rec_text=`r` &recV=`max` &decimal=`2` &graph=lightpurpleGraph]]
  447. [[!soilAnalysisCalcs? &element=`BS_k` &sbl=`K` &nutrient=`Potassium` &min=`kbs_min` &max=`kbs_max` &type=`%` &text=`c` &rec_text=`r` &recV=`max` &decimal=`2` &graph=lightpurpleGraph]]
  448. [[!soilAnalysisCalcs? &element=`BS_na` &sbl=`Na` &nutrient=`Sodium` &min=`nabs_min` &max=`nabs_max` &type=`%` &text=`c` &rec_text=`r` &recV=`max` &decimal=`2` &graph=lightpurpleGraph]]
  449. [[!soilAnalysisCalcs? &element=`BS_ob` &sbl=`` &nutrient=`Other Bases` &min=`` &max=`ob_rec` &type=`%` &text=`c` &rec_text=`r` &recV=`max` &decimal=`2` &graph=lightpurpleGraph]]
  450. [[!soilAnalysisCalcs? &element=`BS_h` &sbl=`` &nutrient=`Hydrogen` &min=`` &max=`h_rec` &type=`%` &text=`c` &rec_text=`r` &recV=`max` &decimal=`2` &graph=lightpurpleGraph]]
  451. <tr class="chart-header-sub">
  452. <th colspan=3 class="col-16 border-left text-center lightgrey">SOLUBLE MORGAN 2 EXTRACT</th>
  453. <th class="text-center col-16 stripe-1"></th>
  454. <th class="text-center col-16 stripe-1"></th>
  455. <th class="text-center col-16 border-right stripe-1"></th>
  456. </tr>
  457. [[!soilAnalysisCalcs? &element=s_morgan &sbl=`Ca` &nutrient=`Calcium` &min=`` &max=`` &type=`%` &text=`c` &rec_text=`r` &decimal=`0` &graph=lightgreyGraph]]
  458. [[!soilAnalysisCalcs? &element=b_cacl2 &sbl=`Mg` &nutrient=`Magnesium` &min=`` &max=`` &type=`%` &text=`c` &rec_text=`r` &decimal=`0` &graph=lightgreyGraph]]
  459. [[!soilAnalysisCalcs? &element=mn_dtpa &sbl=`K` &nutrient=`Potassium` &min=`` &max=`` &type=`%` &text=`c` &rec_text=`r` &decimal=`0` &graph=lightgreyGraph]]
  460. <tr class="chart-header-sub">
  461. <th colspan=3 class="col-16 border-left text-center lightgrey">ADDITIONAL DATA</th>
  462. <th class="text-center col-16 stripe-1">LOW</th>
  463. <th class="text-center col-16 stripe-1">IDEAL</th>
  464. <th class="text-center col-16 border-right stripe-1">EXCELLENT</th>
  465. </tr>
  466. [[!soilAnalysisCalcs? &element=s_morgan &sbl=`Ca` &nutrient=`Calcium` &min=`` &max=`` &type=`%` &text=`c` &rec_text=`r` &decimal=`0` &graph=lightgreyGraph]]
  467. <tr class="chart-header-sub">
  468. <th colspan=3 class="col-16 border-left text-center lightblue">RATIOS</th>
  469. <th class="text-center col-16 stripe-1"></th>
  470. <th class="text-center col-16 stripe-1"></th>
  471. <th class="text-center col-16 border-right stripe-1"></th>
  472. </tr>
  473. [[!soilAnalysisRatio? &element=ca_mehlick3 &elementTwo=mg_mehlick3 &sbl=`` &rec=`ca_mg_ratio` &nutrient=`Ca:Mg Ratio` &min=`` &max=`` &text=`y` &rec_text=`r` &decimal=`1` &graph=lightblueGraph]]
  474. [[!soilAnalysisCalcs? &element=NH3_N &sbl=`` &nutrient=`Total Nitrogen` &type=`%` &min=`` &max=`` &text=`c` &rec_text=`r` &decimal=`1` &graph=lightblueGraph]]
  475. [[!soilAnalysisCalcs? &element=ocarbon &sbl=`` &nutrient=`Total Carbon` &type=`%` &min=`` &max=`` &text=`c` &rec_text=`r` &decimal=`1` &graph=lightblueGraph]]
  476. [[!soilAnalysisRatio? &element=ocarbon &elementTwo=NO3_N &sbl=`` &rec=`c_n_ratio` &nutrient=`C:N Ratio `&type=`:1` &min=`` &max=`` &text=`y` &rec_text=`r` &decimal=`1` &graph=lightblueGraph]]
  477. <tr>
  478. <td class="border-bottom border-left"></td>
  479. <td class="border-bottom border-left"></td>
  480. <td class="border-bottom border-left nutrient-balance"></td>
  481. <td class="border-bottom border-left"></td>
  482. <td class="border-bottom border-left"></td>
  483. <td class="border-bottom border-left border-right"></td>
  484. </tr>
  485. </tbody>
  486. </table>
  487. <div class="analysis-footer">
  488. <div class="col text-center">&copy; 2008-[[!date?format=year]] Cropmonitor</div>
  489. </div>
  490. </div>
  491. </div>
  492. <!--
  493. <script src="https://cloud.tinymce.com/stable/tinymce.min.js?apiKey=xcotawi18mg1imp8im144buq68h9g3ndd3c9c8215w8qu3ld"></script>
  494. <script>
  495. tinymce.init({
  496. selector: 'textarea',
  497. menubar: false,
  498. toolbar: 'bold italic | alignleft aligncenter alignright alignjustify | bullist numlist | removeformat',
  499. plugins: 'autosave',
  500. autosave_interval: '20s'
  501. });
  502. </script>
  503. -->
  504. <!-- jQuery first, then Popper.js, then Bootstrap JS -->
  505. <script type="text/javascript" src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script>
  506. <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
  507. <script type="text/javascript" src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
  508. <script type="text/javascript">
  509. addEventListener("load", function() {
  510. setTimeout(hideURLbar, 0);
  511. }, false);
  512. function hideURLbar(){
  513. window.scrollTo(0,1);
  514. }
  515. </script>
  516. <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.bundle.min.js" integrity="sha384-xrRywqdh3PHs8keKZN+8zzc5TX0GRTLCcmivcbNJWm2rs5C8PRhcEn3czEjhAO9o" crossorigin="anonymous"></script>
  517. <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.js"></script>
  518. <script src="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/jquery.magnific-popup.js"></script>
  519. <script>
  520. //https://github.com/eKoopmans/html2pdf.js
  521. $('.downloadPDF').click(function () {
  522. var element = document.getElementById('content'); //document.createElement("body");
  523. element.classList.remove('screen');
  524. element.classList.add('print');
  525. var opt = {
  526. margin: 3,
  527. filename: 'soil-analysis.pdf',
  528. image: { type: 'jpeg', quality: 1.0 },
  529. html2canvas: { scale: 2, letterRendering: true, windowWidth: 1024 }, //, windowWidth: 1024
  530. jsPDF: { orientation: 'portrait', unit: 'mm', format: 'a4', putOnlyUsedFonts: true, floatPrecision: 'smart', }
  531. };
  532. html2pdf()
  533. .from(element)
  534. .toPdf()
  535. .set(opt)
  536. .save()
  537. .then(function(){
  538. element.classList.remove('print');
  539. element.classList.add('screen');
  540. });
  541. });
  542. </script>
  543. </body>
  544. </html>