Benjamin Harris 3 месяцев назад
Родитель
Сommit
f522cadc9a
23 измененных файлов с 5035 добавлено и 411 удалено
  1. 1 46
      .htaccess
  2. 15 0
      config/database.php
  3. 432 0
      dashboard/client-settings/index.php
  4. 357 0
      dashboard/client-settings/product-list.php
  5. 261 0
      dashboard/client-settings/soil-recommendations.php
  6. 24 0
      dashboard/client-settings/updateproduct.php
  7. 493 0
      dashboard/crop-analysis/animal-dietary-balance/amdb.php
  8. 218 0
      dashboard/crop-analysis/animal-dietary-balance/animal-dietary-balance.php
  9. 140 0
      dashboard/crop-analysis/animal-dietary-balance/animal-submit.php
  10. 161 0
      dashboard/crop-analysis/compost-test-data/compost-test-data.php
  11. 154 0
      dashboard/crop-analysis/plant-test-data/generating-plant-analysis.php
  12. 252 0
      dashboard/crop-analysis/plant-test-data/plant-analysis.php
  13. 109 0
      dashboard/crop-analysis/plant-test-data/plant-rec-update.php
  14. 282 0
      dashboard/crop-analysis/plant-test-data/plant-recommendations.php
  15. 168 0
      dashboard/crop-analysis/plant-test-data/plant-report.php
  16. 115 0
      dashboard/crop-analysis/plant-test-data/plant-test-report.php
  17. 33 364
      dashboard/crop-analysis/soil-analysis.php
  18. 2 0
      dashboard/crop-analysis/soil-test-data.php
  19. 292 0
      dashboard/crop-analysis/water-test-data/water-analysis-pdf.php
  20. 507 0
      dashboard/crop-analysis/water-test-data/water-test-data.php
  21. 207 0
      dashboard/crop-analysis/water-test-data/water-uploadsubmit.php
  22. 811 0
      dashboard/crop-cards/index.php
  23. 1 1
      lib/soil_calculations.php

+ 1 - 46
.htaccess

@@ -1,60 +1,15 @@
-# MODX supports Friendly URLs via this .htaccess file. You must serve web
-# pages via Apache with mod_rewrite to use this functionality, and you must
-# change the file name from ht.access to .htaccess.
-#
-# Make sure RewriteBase points to the directory where you installed MODX.
-# E.g., "/modx" if your installation is in a "modx" subdirectory.
-#
-# You may choose to make your URLs non-case-sensitive by adding a NC directive
-# to your rule: RewriteRule ^(.*)$ index.php?q=$1 [L,QSA,NC]
-
 RewriteEngine On
 RewriteBase /
 
-
-# Prevent rewrite the .well-known directory used by LetsEncrypt by rules below of this rule
 RewriteRule "^\.well-known/" - [L]
 
-
-# Prevent dot directories (hidden directories like .git) to be exposed to the public
-# Except for the .well-known directory used by LetsEncrypt a.o
 RewriteRule "/\.|^\.(?!well-known/)" - [F]
 
-
-# Rewrite www.example.com -> example.com -- used with SEO Strict URLs plugin
 RewriteCond %{HTTP_HOST} .
 RewriteCond %{HTTP_HOST} ^www.(.*)$ [NC]
 RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
-#
-# or for the opposite example.com -> www.example.com use the following
-# DO NOT USE BOTH
-#
-#RewriteCond %{HTTP_HOST} !^$
-#RewriteCond %{HTTP_HOST} !^www\. [NC]
-#RewriteCond %{HTTP_HOST} (.+)$
-#RewriteRule ^(.*)$ https://www.%1/$1 [R=301,L] .
-
-
-# Force rewrite to https for every host
-RewriteCond %{HTTPS} !=on [OR]
-RewriteCond %{SERVER_PORT} !^443
-RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
-
-
-# Redirect the manager to a specific domain - don't rename the ht.access file
-# in the manager folder to use this this rule
-#RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
-#RewriteCond %{REQUEST_URI} ^/manager [NC]
-#RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
-
 
 # The Friendly URLs part
 RewriteCond %{REQUEST_FILENAME} !-f
 RewriteCond %{REQUEST_FILENAME} !-d
-RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
-
-
-# For servers that support output compression, you should pick up a bit of
-# speed by un-commenting the following lines.
-# php_flag zlib.output_compression On
-# php_value zlib.output_compression_level 5
+RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

+ 15 - 0
config/database.php

@@ -28,4 +28,19 @@ try {
     error_log("Database connection failed: " . $e->getMessage());
     die("Database connection failed. Please try again later.");
 }
+
+/**
+ * Return a shared PDO connection instance.
+ *
+ * @return PDO
+ */
+function getDBConnection(): PDO
+{
+    global $pdo;
+    if (!isset($pdo)) {
+        throw new RuntimeException('Database connection not initialized');
+    }
+    return $pdo;
+}
+
 ?>

+ 432 - 0
dashboard/client-settings/index.php

@@ -0,0 +1,432 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+	<title>[[*longtitle]] | [[++site_name]]</title>
+	<base href="[[!++site_url]]">
+	<meta charset="[[++modx_charset]]">
+	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+	<meta name="keywords" content="[[*introtext]]">
+	<meta name="description" content="[[*description]]">
+	<link rel="icon" href="client-assets/images/favicon.ico?v=2" type="image/x-icon"> [[!Profile]]
+	
+	<script type="text/javascript">
+    	window.dataLayer = window.dataLayer || [];
+    
+    	function gtag() {
+    		dataLayer.push(arguments);
+    	}
+    	gtag('js', new Date());
+    	gtag('set', {
+    		'user_id': '[[+modx.user.id]]'
+    	}); // Set the user ID using signed-in user_id.
+    	gtag('config', 'UA-133963301-1');
+	</script>
+	
+	<link href="https://cdn.jsdelivr.net/npm/simple-datatables@latest/dist/style.css" rel="stylesheet" />
+	<link href="client-assets/css/dashboard-2021.css" rel="stylesheet" />
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/js/all.min.js" crossorigin="anonymous"></script>
+	<link href="https://cdn.datatables.net/1.10.20/css/dataTables.bootstrap4.min.css" rel="stylesheet" crossorigin="anonymous" />
+	<script src="client-assets/js/skycons.js"></script>
+	<style>
+    	.btn-append {
+    		color: #495057;
+    		background-color: #e9ecef;
+    		border: 1px solid #ced4da;
+    	}
+    	.footer {
+    		position: absolute;
+    		bottom: 0;
+    		width: 100%;
+    		height: 60px;
+    		line-height: 60px;
+    	}
+	</style>
+</head>
+
+<body class="sb-nav-fixed" id="page-top"> 
+    [[!Personalize?
+        &yesChunk=`navHeaderLogged`
+        &noChunk=`navHeader`
+        &allowedGroups=`basicClients,bacicAdmin,companyClients,companyManagers`
+    ]]
+    
+	<div id="layoutSidenav">
+	    <div id="layoutSidenav_nav">
+    		<!-- Sidebar -->
+    		[[Wayfinder?
+    		    &startId=`2` 
+        		&displayStart=`0` 
+        		&startitemTpl=`startitemTpl` 
+        		&selfClass=`show` 
+        		&level=`2`
+        		&outerTpl=`outer`
+        		    &outerClass=`sb-sidenav accordion sb-sidenav-dark`
+        		&rowTpl=`row`
+        		    &rowClass=`nav-link`
+        		&parentRowTpl=`parentRow`
+        		    &parentClass=`nav-link collapsed`
+        		&innerTpl=`inner`
+        		    &innerClass=`collapse`
+        		&innerRowTpl=`secondInner`
+        		    &innerRowClass=`nav-link`
+    		]]
+        </div>
+		
+		<div id="layoutSidenav_content">
+			<main>
+
+				<div class="container-fluid px-4">
+				    <h1 class="mt-4">[[*pagetitle]]</h1>
+
+					<ol class="breadcrumb mb-4"> [[$dash-breadcrumbs]] </ol>
+					
+					<div class="row">
+					    <div class="container-fluid">
+	
+
+	[[!Profile]]
+	<div class="row">
+		<div class="col-sm-3">
+			<h2 class="text-center">[[+fullname]]</h2>
+		</div>
+		<div class="col-sm-9">
+		    <!-- <a href="/users" class="pull-right">
+		        <img title="profile image" class="img-circle img-responsive" src="">
+		    </a> -->
+		</div>
+	</div>
+
+	
+	<div class="row">
+		
+		<div class="col-sm-3">
+			<!--left col-->
+			<div class="text-center">
+				<img src="[[+photo]]" class="avatar img-circle img-fluid img-thumbnail" alt="avatar"> <!-- https://ssl.gstatic.com/accounts/ui/avatar_2x.png -->
+				    <h6> </h6>
+				<!-- <input type="file" class="text-center center-block file-upload"> -->
+				
+				<span class="error">[[+error.photo]]</span>
+				[[!UpdateProfile? &useExtended=`1` &submitVar=`file-upload` &preHooks=`user_profile_image`]]
+				<form class="form" enctype="multipart/form-data" action="[[~[[*id]]]]" method="post">
+				    [[+login.update_success:if=`[[+login.update_success]]`:is=`1`:then=`[[%login.profile_updated? &namespace=`login` &topic=`updateprofile`]]`]]
+				    <input type="hidden" name="nospam:blank" value="" />
+
+				    <div class="input-group mb-3">
+                      <div class="custom-file">
+                        <input type="file" class="custom-file-input" name="photo" id="photo" value="[[+photo]]" >
+                        <label class="custom-file-label text-left" for="photo">Choose file</label>
+                      </div>
+                      <div class="input-group-append">
+                        <button class="btn btn-outline-secondary" id="file-upload" name="file-upload" type="button">Upload</button>
+                      </div>
+                    </div>
+
+
+				</form>
+			</div>
+			</hr>
+			<br>
+			
+			<div class="alert alert-success" role="alert">Your Account level is: <b>FREE</b> <a href="#" class="alert-link">Upgrade Account</a></div>
+			<div class="alert" role="alert"></div>
+			
+			<!--
+    			<div class="panel panel-default">
+    				<div class="panel-heading">Website <i class="fa fa-link fa-1x"></i></div>
+    				<div class="panel-body"><a href="#"></a></div>
+    			</div>
+    			
+    			<ul class="list-group">
+    				<li class="list-group-item text-muted">Activity <i class="fa fa-dashboard fa-1x"></i></li>
+    				<li class="list-group-item text-right"><span class="pull-left"><strong>Shares</strong></span></li>
+    				<li class="list-group-item text-right"><span class="pull-left"><strong>Likes</strong></span></li>
+    				<li class="list-group-item text-right"><span class="pull-left"><strong>Posts</strong></span></li>
+    				<li class="list-group-item text-right"><span class="pull-left"><strong>Followers</strong></span></li>
+    			</ul>
+			
+    			<div class="panel panel-default">
+    				<div class="panel-heading">Social Media</div>
+    				<div class="panel-body">
+    					<i class="fa fa-facebook fa-2x"></i> <i class="fa fa-github fa-2x"></i> <i class="fa fa-twitter fa-2x"></i> <i class="fa fa-pinterest fa-2x"></i> <i class="fa fa-google-plus fa-2x"></i>
+    				</div>
+    			</div>
+			-->
+			
+		</div>
+		<!--/col-3-->
+		
+		<div class="col-sm-9">
+
+			<ul class="nav nav-tabs">
+				<li class="nav-item">
+				    <a class="nav-link" data-toggle="tab" href="#contact-details">Your Details</a>
+				</li>
+				<li>
+				    <a class="nav-link" data-toggle="tab" href="#change-password">Change Password</a>
+				</li>
+				<li>
+				    <a class="nav-link" data-toggle="tab" href="#messages">Personal Messages</a>
+				</li>
+			</ul>
+			
+			<div class="tab-content">
+				<div class="tab-pane" id="contact-details">
+				<br>
+					
+					[[!UpdateProfile? 
+					&submitVar=`form-save`
+					&validate=`
+					    fullname:required,
+					    mobilephone:required,
+					    email:required,
+					    address:required,
+					    city:required,
+					    state:required,
+					    zip:required`]]
+					
+					<div class="updprof-error">[[+error.message]]</div>
+                    [[+login.update_success:is=`1`:then=`[[%login.profile_updated? &namespace=`login` &topic=`updateprofile`]]`]]
+                    
+                    
+					<form class="form" action="[[~[[*id]]]]" method="post" id="registrationForm">
+						
+						<div class="form-row">
+							<div class="col-md-6 ">
+								<label for="fullname">Name</label>
+								<input type="text" class="form-control" name="fullname" id="fullname" value="[[+fullname]]" />
+								<small class="error">[[+error.fullname]]</small>
+							</div>
+
+							<div class="col-md-6 ">
+								<label for="phone">Company</label>
+								<input type="text" class="form-control" name="company" id="company" value="[[+fax]]" />
+								<small class="error">[[+error.fax]]</small>
+							</div>
+						</div>
+						
+						<div class="form-row">
+							<div class="col-md-6 ">
+								<label for="phone">Phone</label>
+								<input type="text" class="form-control" name="phone" id="phone" value="[[+phone]]" />
+								<small class="error">[[+error.phone]]</small>
+							</div>
+
+							<div class="col-md-6 ">
+								<label for="mobilephone">Mobile</label>
+								<input type="text" class="form-control" name="mobilephone:required" id="mobilephone" value="[[+mobilephone]]" />
+								<small class="error">[[+error.mobilephone]]</small>
+							</div>
+						</div>
+						
+						<div class="form-row">
+							<div class="col-md-12">
+								<label for="email">Email</label>
+								<input type="email" class="form-control" name="email:required" id="email" value="[[+email]]" />
+								<small class="error">[[+error.email]]</small>
+							</div>
+						</div>
+						
+						<div class="form-row">
+							<div class="col-md-12">
+								<label for="address">Address</label>
+								<input type="text" class="form-control" name="address:required" id="address" value="[[+address]]" />
+								<small class="error">[[+error.address]]</small>
+							</div>
+						</div>
+						
+						<div class="form-row">
+							<div class="col-md-3 ">
+								<label for="city">City</label>
+								<input type="text" class="form-control" name="city:required" id="city" value="[[+city]]" />
+								<small class="error">[[+error.city]]</small>
+							</div>
+
+							<div class="col-md-3 ">
+								<label for="state">State</label>
+								<input type="text" class="form-control" name="state:required" id="state" value="[[+state]]" />
+								<small class="error">[[+error.state]]</small>
+							</div>
+
+							<div class="col-md-3 ">
+								<label for="zip">Postcode</label>
+								<input type="text" class="form-control" name="zip:required" id="zip" value="[[+zip]]" />
+								<small class="error">[[+error.zip]]</small>
+							</div>
+							
+							<div class="col-md-3 ">
+								<label for="state">Country</label>
+								<input type="text" class="form-control" name="country:required" id="country" value="[[+country]]" />
+								<small class="error">[[+error.country]]</small>
+							</div>
+						</div>
+						
+						<hr>
+						<h4>Industry Details</h4>
+						
+						<div class="form-row">
+							<div class="col-md-6 ">
+								<label for="fullname">Industry</label>
+								<select class="form-control" name="industry" name="industry" id="industry" value="[[+website]]">
+									<option selected>[[+website]]</option>
+									<option name="broadacre">Broadacre</option>
+									<option name="viticulture">Viticulture</option>
+									<option name="horticulture">Horticulture</option>
+									<option name="permaculture">Permaculture</option>
+									<option name="dairy">Dairy</option>
+								</select>
+								<small class="error">[[+error.website]]</small>
+							</div>
+
+							<div class="col-md-6 ">
+								<label for="phone">Role</label>
+								<select class="form-control" name="role" name="role" id="role" value="[[+phone]]">
+									<option selected>[[+phone]]</option>
+									<option name="manager">Manager</option>
+									<option name="viticulturist">Viticulturist</option>
+									<option name="horticulturist">Horticulturist</option>
+									<option name="permaculturist">Permaculturist</option>
+									<option name="irrigation-manager">Irrigation Manager</option>
+								</select>
+								<small class="error">[[+error.phone]]</small>
+							</div>
+						</div>
+
+						<div class="form-group">
+							<div class="col-md-12">
+								<br>
+								<button class="btn btn-lg btn-success" id="form-save" name="form-save" type="submit"><i class="glyphicon glyphicon-ok-sign"></i> Save</button>
+								<button class="btn btn-lg btn-warning" type="reset"><i class="glyphicon glyphicon-repeat"></i> Reset</button>
+							</div>
+						</div>
+					
+					</form>
+					<hr>
+				</div>
+				<!--/tab-pane-->
+				
+				
+				<div class="tab-pane" id="change-password">
+					
+					[[!ChangePassword?
+                        &submitVar=`change-password`
+                        &placeholderPrefix=`cp.`
+                        &validateOldPassword=`1`
+                        &validate=`nospam:blank`
+                        &successMessage=`Your password is changed`
+                    ]]
+                    
+                    <form action="[[~[[*id]]]]" method="post">
+                        <input type="hidden" name="nospam" value="" />
+                      <div class="form-group">
+                        <label for="password_old">Old Password <span style="color: red;">[[!+cp.error.password_old]]</span></label>
+                        <input type="password" class="form-control" name="password_old" id="password_old" value="[[+cp.password_old]]" aria-describedby="password_old" placeholder="Old Password">
+                        <small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
+                      </div>
+                      <div class="form-group">
+                        <label for="exampleInputPassword1">New Password <span style="color: red;">[[!+cp.error.password_new]]</span></label>
+                        <input type="password" class="form-control" name="password_new" id="password_new" value="[[+cp.password_new]]" placeholder="New Password">
+                      </div>
+                      <div class="form-group">
+                        <label for="exampleInputPassword1">Confirm New Password <span style="color: red;">[[!+cp.error.password_new_confirm]]</span></label>
+                        <input type="password" class="form-control" name="password_new_confirm" id="password_new_confirm" value="[[+cp.password_new_confirm]]" placeholder="Confirm New Password">
+                      </div>
+                      <input type="submit" class="btn btn-primary" name="change-password" value="Change Password" >
+                    </form>
+					
+				</div>
+				<!--/tab-pane-->
+				
+				<div class="tab-pane" id="messages">
+					
+				</div>
+				
+			</div>
+			<!--/tab-pane-->
+		</div>
+		<!--/tab-content-->
+	</div>
+	<!--/col-9-->
+</div>
+<!--/row-->
+</div>
+
+
+<script>
+	$(document).ready(function() {
+    	var readURL = function(input) {
+    	    if (input.files && input.files[0]) {
+    	        var reader = new FileReader();
+    	
+    	        reader.onload = function (e) {
+    	            $('.avatar').attr('src', e.target.result);
+    	        }
+    	
+    	        reader.readAsDataURL(input.files[0]);
+    	    }
+    	}
+    
+    	$(".file-upload").on('change', function(){
+    	    readURL(this);
+    	});
+	});
+</script>
+					</div>
+
+				</div>
+
+			</main>
+			
+			<footer class="py-4 bg-light mt-auto">
+                <div class="container-fluid px-4">
+                    <div class="d-flex align-items-center justify-content-between small">
+                        <div class="text-muted">[[SimpleCopyright? &startYear=`2003`]]. All Rights Reserved <a href="[[~1]]"></a></div>
+                        <div>
+                            <a href="[[~39~]]">Privacy Policy</a>
+                            &middot;
+                            <a href="[[~39~]]">Terms &amp; Conditions</a>
+                        </div>
+                    </div>
+                </div>
+            </footer>
+            
+		</div>
+
+	</div>
+
+	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
+	<script>
+    	/*!
+            * Start Bootstrap - SB Admin v7.0.3 (https://startbootstrap.com/template/sb-admin)
+            * Copyright 2013-2021 Start Bootstrap
+            * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-sb-admin/blob/master/LICENSE)
+            */
+            // 
+        // Scripts
+        // 
+        
+        window.addEventListener('DOMContentLoaded', event => {
+        
+            // Toggle the side navigation
+            const sidebarToggle = document.body.querySelector('#sidebarToggle');
+            if (sidebarToggle) {
+                // Uncomment Below to persist sidebar toggle between refreshes
+                // if (localStorage.getItem('sb|sidebar-toggle') === 'true') {
+                //     document.body.classList.toggle('sb-sidenav-toggled');
+                // }
+                sidebarToggle.addEventListener('click', event => {
+                    event.preventDefault();
+                    document.body.classList.toggle('sb-sidenav-toggled');
+                    localStorage.setItem('sb|sidebar-toggle', document.body.classList.contains('sb-sidenav-toggled'));
+                });
+            }
+        
+        });
+
+	</script>
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js" crossorigin="anonymous"></script>
+	<script src="https://cdn.jsdelivr.net/npm/simple-datatables@latest" crossorigin="anonymous"></script>
+</body>
+</html>

+ 357 - 0
dashboard/client-settings/product-list.php

@@ -0,0 +1,357 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+	<title>[[*longtitle]] | [[++site_name]]</title>
+	<base href="[[!++site_url]]">
+	<meta charset="[[++modx_charset]]">
+	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+	<meta name="keywords" content="[[*introtext]]">
+	<meta name="description" content="[[*description]]">
+	<link rel="icon" href="client-assets/images/favicon.ico?v=2" type="image/x-icon"> [[!Profile]]
+	
+	<script type="text/javascript">
+    	window.dataLayer = window.dataLayer || [];
+    
+    	function gtag() {
+    		dataLayer.push(arguments);
+    	}
+    	gtag('js', new Date());
+    	gtag('set', {
+    		'user_id': '[[+modx.user.id]]'
+    	}); // Set the user ID using signed-in user_id.
+    	gtag('config', 'UA-133963301-1');
+	</script>
+	
+	<link href="https://cdn.jsdelivr.net/npm/simple-datatables@latest/dist/style.css" rel="stylesheet" />
+	<link href="client-assets/css/dashboard-2021.css" rel="stylesheet" />
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/js/all.min.js" crossorigin="anonymous"></script>
+	<link href="https://cdn.datatables.net/1.10.20/css/dataTables.bootstrap4.min.css" rel="stylesheet" crossorigin="anonymous" />
+	<script src="client-assets/js/skycons.js"></script>
+	<style>
+    	.btn-append {
+    		color: #495057;
+    		background-color: #e9ecef;
+    		border: 1px solid #ced4da;
+    	}
+    	.footer {
+    		position: absolute;
+    		bottom: 0;
+    		width: 100%;
+    		height: 60px;
+    		line-height: 60px;
+    	}
+	</style>
+</head>
+
+<body class="sb-nav-fixed" id="page-top"> 
+    [[!Personalize?
+        &yesChunk=`navHeaderLogged`
+        &noChunk=`navHeader`
+        &allowedGroups=`basicClients,bacicAdmin,companyClients,companyManagers`
+    ]]
+    
+	<div id="layoutSidenav">
+	    <div id="layoutSidenav_nav">
+    		<!-- Sidebar -->
+    		[[Wayfinder?
+    		    &startId=`2` 
+        		&displayStart=`0` 
+        		&startitemTpl=`startitemTpl` 
+        		&selfClass=`show` 
+        		&level=`2`
+        		&outerTpl=`outer`
+        		    &outerClass=`sb-sidenav accordion sb-sidenav-dark`
+        		&rowTpl=`row`
+        		    &rowClass=`nav-link`
+        		&parentRowTpl=`parentRow`
+        		    &parentClass=`nav-link collapsed`
+        		&innerTpl=`inner`
+        		    &innerClass=`collapse`
+        		&innerRowTpl=`secondInner`
+        		    &innerRowClass=`nav-link`
+    		]]
+        </div>
+		
+		<div id="layoutSidenav_content">
+			<main>
+
+				<div class="container-fluid px-4">
+				    <h1 class="mt-4">[[*pagetitle]]</h1>
+
+					<ol class="breadcrumb mb-4"> [[$dash-breadcrumbs]] </ol>
+					
+					<div class="row">
+					    <div class="grid-form">
+    <!---->
+    <div class="grid-form1">
+        <h3>Company Product Analysis</h3>
+        <p>Products used in Soil Analysis recommendation programs.</p>
+        <div class="tab-content">
+        <!-- Company Product list here -->    
+        
+        <?php
+$result    = null;
+
+$modx_user = $modx->user->get('id');
+?>
+<table class="table table-bordered">
+<tbody>
+    <tr>
+        <th class='col-20'>ID</th>
+        <th class='col-20'>Product</th>
+        <th class='col-20'>Chemical</th>
+        <th class='col-20'>N</th>
+        <th class='col-20'>P</th>
+        <th class='col-20'>K</th>
+        <th class='col-20'>Na</th>
+        <th class='col-20'>Ca</th>
+        <th class='col-20'>Mg</th>
+        <th class='col-20'>B</th>
+        <th class='col-20'>Zn</th>
+        <th class='col-20'>Cu</th>
+        <th class='col-20'>Mn</th>
+        <th class='col-20'>Fe</th>
+        <th class='col-20'>Co</th>
+        <th class='col-20'>Mo</th>
+    </tr>
+
+<?php
+//Database connection
+//$con = mysqli_connect("localhost", "root", "R3M0T31", "cropmonitor");
+$con = mysqli_connect("localhost", "cropmonitor", "brvnCcaEYxlPCS3", "cropmonitor");
+
+// Check connection
+if (mysqli_connect_errno()) {
+    echo "Failed to connect to MySQL: " . mysqli_connect_error();
+}
+
+// Get results from database 
+$result = mysqli_query($con, "SELECT * FROM `fertiliser_specifications` WHERE `modx_user_id` = " . $modx_user . " ");
+                                 //
+
+if ($result === FALSE) {
+    die(mysqli_error($con)); // TODO: better error handling
+    echo "User Profile incorrect";
+} else {
+    while ($row = mysqli_fetch_array($result)) {
+        
+        $id = $row['id'];
+        $modx_user = $row['modx_user_id'];
+?>
+
+        <tr>
+        <td class='left'><?php echo $row['id']; ?> </td>
+        <td class='left'><b><?php echo $row['name']; ?></b></td>
+        <td class='left'><?php echo $row['chemical']; ?></td>
+        <td contenteditable='true' onBlur="updateDatabase(this,'n','<?php echo $id; ?>')" onClick='showEdit(this);' class='left'><?php echo $row['n']; ?></td>
+        <td contenteditable='true' onBlur="updateDatabase(this,'p','<?php echo $id; ?>')" onClick='showEdit(this);' class='left'><?php echo $row['p']; ?></td>
+        <td contenteditable='true' onBlur="updateDatabase(this,'k','<?php echo $id; ?>')" onClick='showEdit(this);' class='left'><?php echo $row['k']; ?></td>
+        <td contenteditable='true' onBlur="updateDatabase(this,'Na','<?php echo $id; ?>')" onClick='showEdit(this);' class='left'><?php echo $row['Na']; ?></td>
+        <td contenteditable='true' onBlur="updateDatabase(this,'Ca','<?php echo $id; ?>')" onClick='showEdit(this);' class='left'><?php echo $row['Ca']; ?></td>
+        <td contenteditable='true' onBlur="updateDatabase(this,'Mg','<?php echo $id; ?>')" onClick='showEdit(this);' class='left'><?php echo $row['Mg']; ?></td>
+        <td contenteditable='true' onBlur="updateDatabase(this,'B','<?php echo $id; ?>')" onClick='showEdit(this);' class='left'><?php echo $row['B']; ?></td>
+        <td contenteditable='true' onBlur="updateDatabase(this,'Zn','<?php echo $id; ?>')" onClick='showEdit(this);' class='left'><?php echo $row['Zn']; ?></td>
+        <td contenteditable='true' onBlur="updateDatabase(this,'Cu','<?php echo $id; ?>')" onClick='showEdit(this);' class='left'><?php echo $row['Cu']; ?></td>
+        <td contenteditable='true' onBlur="updateDatabase(this,'Mn','<?php echo $id; ?>')" onClick='showEdit(this);' class='left'><?php echo $row['Mn']; ?></td>
+        <td contenteditable='true' onBlur="updateDatabase(this,'Fe','<?php echo $id; ?>')" onClick='showEdit(this);' class='left'><?php echo $row['Fe']; ?></td>
+        <td contenteditable='true' onBlur="updateDatabase(this,'Co','<?php echo $id; ?>')" onClick='showEdit(this);' class='left'><?php echo $row['Co']; ?></td>
+        <td contenteditable='true' onBlur="updateDatabase(this,'Mo','<?php echo $id; ?>')" onClick='showEdit(this);' class='left'><?php echo $row['Mo']; ?></td>
+        </tr>
+
+
+<?php
+    }
+}
+
+mysqli_close($con);
+?>
+
+    </tbody>
+</table>
+
+<script type="text/javascript">
+    function showEdit(editableObj) {
+        $(editableObj).css("background", "#97e499");
+    }
+    function updateDatabase(editableObj, column, id) {
+        $(editableObj).css("background", "#FDFDFD");
+        $.ajax({
+            url: "[[~57]]",
+            type: "POST",
+            data: 'column=' + column + '&editval=' + editableObj.innerHTML + '&id=' + id,
+            success: function (data) {
+                $(editableObj).css("background", "white");
+            }
+        });
+    }
+</script>
+?>
+            
+        </div>
+    </div>
+    
+<div class="bs-example2 bs-example-padded-bottom">
+    <button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
+    Add Product
+    </button>
+    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
+        <div class="modal-dialog">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+                    <h2 class="modal-title">Add New Product</h2>
+                </div>
+                    <div class="modal-body">
+                		<form method="post" action="" id="newClientDetails" >
+                		<div class="grid-form">
+                		    <input type="hidden" class="form-control" name="m_user" id="m_user" value="[[+modx.user.id]]" required>
+                		        <input type="hidden" class="form-control" name="modx_user_attributes" id="modx_user_attributes" value="[[+modx.user.id]]" required>
+                		    <div class="form-horizontal">
+                    		    <div class="form-group">
+                    		    <label class="sr-only" for="name">Product:</label>
+                    		        <input type="text" class="form-control" name="name" placeholder="Product Name" id="name" required >
+                                </div>
+                                <div class="form-group">
+                    		    <label class="sr-only" for="chemical">Chemical Symbol:</label>
+                    		        <input type="text" class="form-control" name="chemical" placeholder="Chemical" id="chemical"  >
+                    		    </div>
+                		    </div>
+                		    <div class="form-horizontal">
+                    		    <div class="form-group">
+                    		        <label class="sr-only" for="N">Nitrogen - N</label>
+                    		        <input type="email" class="form-control" name="N" placeholder="Nitrogen" required id="N"  >
+                                </div>
+                                <div class="form-group">
+                    		        <label class="sr-only" for="P">Phosphorus - P</label>
+                    		        <input type="text" class="form-control" name="P" placeholder="Phosphorus" id="P"  >
+                                </div>
+                		    </div>
+                		    <div class="form-horizontal">
+                    		    <div class="form-group">
+                    		        <label class="sr-only" for="k">Postassium - K</label>
+                    		        <input type="text" class="form-control" name="K" placeholder="Postassium" id="K" >
+                                </div>
+                                <div class="form-group">    
+                    		        <label class="sr-only" for="Na">Sodium - Na</label>
+                    		        <input type="text" class="form-control" name="Na" placeholder="Sodium" id="Na" >
+                                </div>
+                		    </div>
+                		    <div class="form-horizontal">
+                    		    <div class="form-group">
+                    		        <label class="sr-only"for="Ca">Calcium - Ca</label>
+                    		        <input type="text" class="form-control" name="Ca" placeholder="Calcium" required id="Ca"  >
+                                </div>
+                                <div class="form-group">                    		        
+                    		        <label class="sr-only" for="Mn">Magnesium - Mg</label>
+                    		        <input type="text" class="form-control" name="Mg" placeholder="Magnesium" required id="Mg"  >
+                    		    </div>
+                		    </div>
+                		    <div class="form-horizontal">
+                    		    <div class="form-group">
+                    		        <label class="sr-only" for="B">Boron - B</label>
+                    		        <input type="text" class="form-control" name="B" placeholder="Boron" id="B" >
+                                </div>
+                                <div class="form-group">    
+                    		        <label class="sr-only" for="Zn">Zinc - Zn</label>
+                    		        <input type="text" class="form-control" name="Zn" placeholder="Zinc" id="Zn" >
+                                </div>
+                		    </div>
+                		    <div class="form-horizontal">
+                    		    <div class="form-group">
+                    		        <label class="sr-only" for="Cu">Copper - Cu</label>
+                    		        <input type="text" class="form-control" name="Cu" placeholder="Copper" id="Cu" >
+                                </div>
+                                <div class="form-group">    
+                    		        <label class="sr-only" for="Mn">Manganese - Mn</label>
+                    		        <input type="text" class="form-control" name="Mn" placeholder="Manganese" id="Mn" >
+                                </div>
+                            </div>
+                            <div class="form-horizontal">
+                    		    <div class="form-group">
+                    		        <label class="sr-only" for="Fe">Iron - Fe</label>
+                    		        <input type="text" class="form-control" name="Fe" placeholder="Iron" id="Fe" >
+                                </div>
+                                <div class="form-group">    
+                    		        <label class="sr-only" for="Co">Colbalt - Co</label>
+                    		        <input type="text" class="form-control" name="Co" placeholder="Colbalt" id="Co" >
+                                </div>
+                		    </div>
+                		    <div class="form-horizontal">
+                    		    <div class="form-group">
+                    		        <label class="sr-only" for="M0">Molybdenum - Mo</label>
+                    		        <input type="text" class="form-control" name="Mo" placeholder="Molybdenum" id="Mo" >
+                                </div>
+                            </div>
+                         </div>
+                        </form>
+                	</div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+                    <button type="button" class="btn btn-primary">Save changes</button>
+                </div>
+            </div><!-- /.modal-content -->
+        </div><!-- /.modal-dialog -->
+    </div>
+</div>
+           
+           
+</div>
+					</div>
+
+				</div>
+
+			</main>
+			
+			<footer class="py-4 bg-light mt-auto">
+                <div class="container-fluid px-4">
+                    <div class="d-flex align-items-center justify-content-between small">
+                        <div class="text-muted">[[SimpleCopyright? &startYear=`2003`]]. All Rights Reserved <a href="[[~1]]"></a></div>
+                        <div>
+                            <a href="[[~39~]]">Privacy Policy</a>
+                            &middot;
+                            <a href="[[~39~]]">Terms &amp; Conditions</a>
+                        </div>
+                    </div>
+                </div>
+            </footer>
+            
+		</div>
+
+	</div>
+
+	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
+	<script>
+    	/*!
+            * Start Bootstrap - SB Admin v7.0.3 (https://startbootstrap.com/template/sb-admin)
+            * Copyright 2013-2021 Start Bootstrap
+            * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-sb-admin/blob/master/LICENSE)
+            */
+            // 
+        // Scripts
+        // 
+        
+        window.addEventListener('DOMContentLoaded', event => {
+        
+            // Toggle the side navigation
+            const sidebarToggle = document.body.querySelector('#sidebarToggle');
+            if (sidebarToggle) {
+                // Uncomment Below to persist sidebar toggle between refreshes
+                // if (localStorage.getItem('sb|sidebar-toggle') === 'true') {
+                //     document.body.classList.toggle('sb-sidenav-toggled');
+                // }
+                sidebarToggle.addEventListener('click', event => {
+                    event.preventDefault();
+                    document.body.classList.toggle('sb-sidenav-toggled');
+                    localStorage.setItem('sb|sidebar-toggle', document.body.classList.contains('sb-sidenav-toggled'));
+                });
+            }
+        
+        });
+
+	</script>
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js" crossorigin="anonymous"></script>
+	<script src="https://cdn.jsdelivr.net/npm/simple-datatables@latest" crossorigin="anonymous"></script>
+</body>
+</html>

+ 261 - 0
dashboard/client-settings/soil-recommendations.php

@@ -0,0 +1,261 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+	<title>[[*longtitle]] | [[++site_name]]</title>
+	<base href="[[!++site_url]]">
+	<meta charset="[[++modx_charset]]">
+	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+	<meta name="keywords" content="[[*introtext]]">
+	<meta name="description" content="[[*description]]">
+	<link rel="icon" href="client-assets/images/favicon.ico?v=2" type="image/x-icon"> [[!Profile]]
+	
+	<script type="text/javascript">
+    	window.dataLayer = window.dataLayer || [];
+    
+    	function gtag() {
+    		dataLayer.push(arguments);
+    	}
+    	gtag('js', new Date());
+    	gtag('set', {
+    		'user_id': '[[+modx.user.id]]'
+    	}); // Set the user ID using signed-in user_id.
+    	gtag('config', 'UA-133963301-1');
+	</script>
+	
+	<link href="https://cdn.jsdelivr.net/npm/simple-datatables@latest/dist/style.css" rel="stylesheet" />
+	<link href="client-assets/css/dashboard-2021.css" rel="stylesheet" />
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/js/all.min.js" crossorigin="anonymous"></script>
+	<link href="https://cdn.datatables.net/1.10.20/css/dataTables.bootstrap4.min.css" rel="stylesheet" crossorigin="anonymous" />
+	<script src="client-assets/js/skycons.js"></script>
+	<style>
+    	.btn-append {
+    		color: #495057;
+    		background-color: #e9ecef;
+    		border: 1px solid #ced4da;
+    	}
+    	.footer {
+    		position: absolute;
+    		bottom: 0;
+    		width: 100%;
+    		height: 60px;
+    		line-height: 60px;
+    	}
+	</style>
+</head>
+
+<body class="sb-nav-fixed" id="page-top"> 
+    [[!Personalize?
+        &yesChunk=`navHeaderLogged`
+        &noChunk=`navHeader`
+        &allowedGroups=`basicClients,bacicAdmin,companyClients,companyManagers`
+    ]]
+    
+	<div id="layoutSidenav">
+	    <div id="layoutSidenav_nav">
+    		<!-- Sidebar -->
+    		[[Wayfinder?
+    		    &startId=`2` 
+        		&displayStart=`0` 
+        		&startitemTpl=`startitemTpl` 
+        		&selfClass=`show` 
+        		&level=`2`
+        		&outerTpl=`outer`
+        		    &outerClass=`sb-sidenav accordion sb-sidenav-dark`
+        		&rowTpl=`row`
+        		    &rowClass=`nav-link`
+        		&parentRowTpl=`parentRow`
+        		    &parentClass=`nav-link collapsed`
+        		&innerTpl=`inner`
+        		    &innerClass=`collapse`
+        		&innerRowTpl=`secondInner`
+        		    &innerRowClass=`nav-link`
+    		]]
+        </div>
+		
+		<div id="layoutSidenav_content">
+			<main>
+
+				<div class="container-fluid px-4">
+				    <h1 class="mt-4">[[*pagetitle]]</h1>
+
+					<ol class="breadcrumb mb-4"> [[$dash-breadcrumbs]] </ol>
+					
+					<div class="row">
+					    <div class="grid-form">
+    <!---->
+    <div class="grid-form1">
+        <h3>Company Product Analysis</h3>
+        <p>Products used in Soil Analysis recommendation programs.</p>
+        <div class="tab-content">
+        <!-- Company Product list here -->    
+        
+        [[!companyProductList]]
+            
+        </div>
+    </div>
+    
+<div class="bs-example2 bs-example-padded-bottom">
+    <button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
+    Add Product
+    </button>
+    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
+        <div class="modal-dialog">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+                    <h2 class="modal-title">Add New Product</h2>
+                </div>
+                    <div class="modal-body">
+                		<form method="post" action="" id="newClientDetails" >
+                		<div class="grid-form">
+                		    <input type="hidden" class="form-control" name="m_user" id="m_user" value="[[+modx.user.id]]" required>
+                		        <input type="hidden" class="form-control" name="modx_user_attributes" id="modx_user_attributes" value="[[+modx.user.id]]" required>
+                		    <div class="form-horizontal">
+                    		    <div class="form-group">
+                    		    <label class="sr-only" for="name">Product:</label>
+                    		        <input type="text" class="form-control" name="name" placeholder="Product Name" id="name" required >
+                                </div>
+                                <div class="form-group">
+                    		    <label class="sr-only" for="chemical">Chemical Symbol:</label>
+                    		        <input type="text" class="form-control" name="chemical" placeholder="Chemical" id="chemical"  >
+                    		    </div>
+                		    </div>
+                		    <div class="form-horizontal">
+                    		    <div class="form-group">
+                    		        <label class="sr-only" for="N">Nitrogen - N</label>
+                    		        <input type="email" class="form-control" name="N" placeholder="Nitrogen" required id="N"  >
+                                </div>
+                                <div class="form-group">
+                    		        <label class="sr-only" for="P">Phosphorus - P</label>
+                    		        <input type="text" class="form-control" name="P" placeholder="Phosphorus" id="P"  >
+                                </div>
+                		    </div>
+                		    <div class="form-horizontal">
+                    		    <div class="form-group">
+                    		        <label class="sr-only" for="k">Postassium - K</label>
+                    		        <input type="text" class="form-control" name="K" placeholder="Postassium" id="K" >
+                                </div>
+                                <div class="form-group">    
+                    		        <label class="sr-only" for="Na">Sodium - Na</label>
+                    		        <input type="text" class="form-control" name="Na" placeholder="Sodium" id="Na" >
+                                </div>
+                		    </div>
+                		    <div class="form-horizontal">
+                    		    <div class="form-group">
+                    		        <label class="sr-only"for="Ca">Calcium - Ca</label>
+                    		        <input type="text" class="form-control" name="Ca" placeholder="Calcium" required id="Ca"  >
+                                </div>
+                                <div class="form-group">                    		        
+                    		        <label class="sr-only" for="Mn">Magnesium - Mg</label>
+                    		        <input type="text" class="form-control" name="Mg" placeholder="Magnesium" required id="Mg"  >
+                    		    </div>
+                		    </div>
+                		    <div class="form-horizontal">
+                    		    <div class="form-group">
+                    		        <label class="sr-only" for="B">Boron - B</label>
+                    		        <input type="text" class="form-control" name="B" placeholder="Boron" id="B" >
+                                </div>
+                                <div class="form-group">    
+                    		        <label class="sr-only" for="Zn">Zinc - Zn</label>
+                    		        <input type="text" class="form-control" name="Zn" placeholder="Zinc" id="Zn" >
+                                </div>
+                		    </div>
+                		    <div class="form-horizontal">
+                    		    <div class="form-group">
+                    		        <label class="sr-only" for="Cu">Copper - Cu</label>
+                    		        <input type="text" class="form-control" name="Cu" placeholder="Copper" id="Cu" >
+                                </div>
+                                <div class="form-group">    
+                    		        <label class="sr-only" for="Mn">Manganese - Mn</label>
+                    		        <input type="text" class="form-control" name="Mn" placeholder="Manganese" id="Mn" >
+                                </div>
+                            </div>
+                            <div class="form-horizontal">
+                    		    <div class="form-group">
+                    		        <label class="sr-only" for="Fe">Iron - Fe</label>
+                    		        <input type="text" class="form-control" name="Fe" placeholder="Iron" id="Fe" >
+                                </div>
+                                <div class="form-group">    
+                    		        <label class="sr-only" for="Co">Colbalt - Co</label>
+                    		        <input type="text" class="form-control" name="Co" placeholder="Colbalt" id="Co" >
+                                </div>
+                		    </div>
+                		    <div class="form-horizontal">
+                    		    <div class="form-group">
+                    		        <label class="sr-only" for="M0">Molybdenum - Mo</label>
+                    		        <input type="text" class="form-control" name="Mo" placeholder="Molybdenum" id="Mo" >
+                                </div>
+                            </div>
+                         </div>
+                        </form>
+                	</div>
+                <div class="modal-footer">
+                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+                    <button type="button" class="btn btn-primary">Save changes</button>
+                </div>
+            </div><!-- /.modal-content -->
+        </div><!-- /.modal-dialog -->
+    </div>
+</div>
+           
+           
+</div>
+					</div>
+
+				</div>
+
+			</main>
+			
+			<footer class="py-4 bg-light mt-auto">
+                <div class="container-fluid px-4">
+                    <div class="d-flex align-items-center justify-content-between small">
+                        <div class="text-muted">[[SimpleCopyright? &startYear=`2003`]]. All Rights Reserved <a href="[[~1]]"></a></div>
+                        <div>
+                            <a href="[[~39~]]">Privacy Policy</a>
+                            &middot;
+                            <a href="[[~39~]]">Terms &amp; Conditions</a>
+                        </div>
+                    </div>
+                </div>
+            </footer>
+            
+		</div>
+
+	</div>
+
+	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
+	<script>
+    	/*!
+            * Start Bootstrap - SB Admin v7.0.3 (https://startbootstrap.com/template/sb-admin)
+            * Copyright 2013-2021 Start Bootstrap
+            * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-sb-admin/blob/master/LICENSE)
+            */
+            // 
+        // Scripts
+        // 
+        
+        window.addEventListener('DOMContentLoaded', event => {
+        
+            // Toggle the side navigation
+            const sidebarToggle = document.body.querySelector('#sidebarToggle');
+            if (sidebarToggle) {
+                // Uncomment Below to persist sidebar toggle between refreshes
+                // if (localStorage.getItem('sb|sidebar-toggle') === 'true') {
+                //     document.body.classList.toggle('sb-sidenav-toggled');
+                // }
+                sidebarToggle.addEventListener('click', event => {
+                    event.preventDefault();
+                    document.body.classList.toggle('sb-sidenav-toggled');
+                    localStorage.setItem('sb|sidebar-toggle', document.body.classList.contains('sb-sidenav-toggled'));
+                });
+            }
+        
+        });
+
+	</script>
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js" crossorigin="anonymous"></script>
+	<script src="https://cdn.jsdelivr.net/npm/simple-datatables@latest" crossorigin="anonymous"></script>
+</body>
+</html>

+ 24 - 0
dashboard/client-settings/updateproduct.php

@@ -0,0 +1,24 @@
+<?php
+	error_reporting(E_ALL);
+	ini_set('display_errors', 1);
+	
+    //Database connection
+    //$con = mysqli_connect("localhost", "root", "R3M0T31", "cropmonitor");
+    $con = mysqli_connect("localhost", "cropmonitor", "brvnCcaEYxlPCS3", "cropmonitor");
+    
+    // Check connection
+    if (mysqli_connect_errno()) {
+        echo "Failed to connect to MySQL: " . mysqli_connect_error();
+    }
+	
+	$column =  mysqli_real_escape_string($con, $_POST["column"]);
+	$id =  mysqli_real_escape_string($con, $_POST["id"]);
+	$editval =  mysqli_real_escape_string($con, $_POST["editval"]);
+	
+	$result = mysqli_query($con, "INSERT INTO fertiliser_specifications(id, $column) VALUES ('$id', '$editval') ON DUPLICATE KEY UPDATE $column = '$editval'" );
+
+	if(mysqli_query($con, $result))
+	{
+		echo $result;
+	}
+	?>

+ 493 - 0
dashboard/crop-analysis/animal-dietary-balance/amdb.php

@@ -0,0 +1,493 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+	<title>[[*longtitle]] | [[++site_name]]</title>
+	<base href="[[!++site_url]]">
+	<meta charset="[[++modx_charset]]">
+	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+	<meta name="keywords" content="[[*introtext]]">
+	<meta name="description" content="[[*description]]">
+	<link rel="icon" href="client-assets/images/favicon.ico?v=2" type="image/x-icon"> [[!Profile]]
+	
+	<script type="text/javascript">
+    	window.dataLayer = window.dataLayer || [];
+    
+    	function gtag() {
+    		dataLayer.push(arguments);
+    	}
+    	gtag('js', new Date());
+    	gtag('set', {
+    		'user_id': '[[+modx.user.id]]'
+    	}); // Set the user ID using signed-in user_id.
+    	gtag('config', 'UA-133963301-1');
+	</script>
+	
+	<link href="https://cdn.jsdelivr.net/npm/simple-datatables@latest/dist/style.css" rel="stylesheet" />
+	<link href="client-assets/css/dashboard-2021.css" rel="stylesheet" />
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/js/all.min.js" crossorigin="anonymous"></script>
+	<link href="https://cdn.datatables.net/1.10.20/css/dataTables.bootstrap4.min.css" rel="stylesheet" crossorigin="anonymous" />
+	<script src="client-assets/js/skycons.js"></script>
+	<style>
+    	.btn-append {
+    		color: #495057;
+    		background-color: #e9ecef;
+    		border: 1px solid #ced4da;
+    	}
+    	.footer {
+    		position: absolute;
+    		bottom: 0;
+    		width: 100%;
+    		height: 60px;
+    		line-height: 60px;
+    	}
+	</style>
+</head>
+
+<body class="sb-nav-fixed" id="page-top"> 
+    [[!Personalize?
+        &yesChunk=`navHeaderLogged`
+        &noChunk=`navHeader`
+        &allowedGroups=`basicClients,bacicAdmin,companyClients,companyManagers`
+    ]]
+    
+	<div id="layoutSidenav">
+	    <div id="layoutSidenav_nav">
+    		<!-- Sidebar -->
+    		[[Wayfinder?
+    		    &startId=`2` 
+        		&displayStart=`0` 
+        		&startitemTpl=`startitemTpl` 
+        		&selfClass=`show` 
+        		&level=`2`
+        		&outerTpl=`outer`
+        		    &outerClass=`sb-sidenav accordion sb-sidenav-dark`
+        		&rowTpl=`row`
+        		    &rowClass=`nav-link`
+        		&parentRowTpl=`parentRow`
+        		    &parentClass=`nav-link collapsed`
+        		&innerTpl=`inner`
+        		    &innerClass=`collapse`
+        		&innerRowTpl=`secondInner`
+        		    &innerRowClass=`nav-link`
+    		]]
+        </div>
+		
+		<div id="layoutSidenav_content">
+			<main>
+
+				<div class="container-fluid px-4">
+				    <h1 class="mt-4">[[*pagetitle]]</h1>
+
+					<ol class="breadcrumb mb-4"> [[$dash-breadcrumbs]] </ol>
+					
+					<div class="row">
+					    <script type="text/javascript" src="//d3js.org/d3.v3.js"></script>
+<script type="text/javascript" src="/client-assets/js/plant.js"></script>
+
+<div class="grid-form1">
+<h3 id="forms-example" class="">[[*longtitle]]</h3>
+
+<span class="error">* required fields.</span>
+
+[[!clientDetailsFORM]]
+
+<form method="post" action="[[~63~]]" id="csvForm" >
+
+    [[!Personalize?
+        &yesChunk=`analysisLogged_Clientdetails`
+        &noChunk=`analysis_Clientdetails`
+    ]]
+    
+    <hr>
+
+    <label class="col"><b>Animal Detail</b></label>
+
+<div class="row">
+    
+    <div class="col-md-3 ">
+        <small id="n" class="form-text text-muted">Enter Dry Matter Intake Per Day  Kg</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control" name="lab_no" id="lab_no" placeholder="Dry Matter" ></input>
+            <div class="input-group-append">
+                <span class="input-group-text" id="">kg</span>
+            </div>
+        </div>
+    </div>
+
+    <div class="col-md-3 ">
+        <small for="batch_no">Animal Weight</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control" name="batch_no" id="batch_no" placeholder="Batch No">
+            <div class="input-group-append">
+                <span class="input-group-text" id="">kg</span>
+            </div>
+        </div>
+    </div>
+    
+    <div class="col-md-3 ">
+        <small id="calving_month" class="form-text text-muted">Calving Month</small>
+        <input class="form-control form-control-sm" name="calving_month" id="datepicker" placeholder="Month" data-date="102/2012" data-date-format="mm/yyyy" data-date-viewmode="years" data-date-minviewmode="months" ></input>
+        <script>
+            $('#datepicker').datepicker({
+                uiLibrary: 'bootstrap4',
+                format: "mm-yyyy",
+                startView: "year", 
+                minView: "year"
+            });
+        </script>
+    </div>
+
+    <div class="col-md-3 ">
+    	<small for="sample_id" class="form-text text-muted">Lactation Period<span class="error">*</span></small>
+    	<div><select name="analysis_type" id="analysis_type" class="form-control form-control-sm" required>
+    		<option>Select the Lactation Period...</option>
+    		<option id="peak">Peak Lactation</option>
+    		<option id="mid">Mid Lactation</option>
+    		<option id="late">Late Lactation</option>
+    	</select>
+    	</div>
+    </div>
+
+</div>
+    <div class="row">
+    <div class="col-md-3  mb-0">
+    	<small id="analysis_type" class="form-text text-muted">Analysis Type<span class="error">*</span></small>
+    	<div><select name="analysis_type" id="analysis_type" class="form-control form-control-sm" required>
+    		<option>Select the type of Analysis...</option>
+    		<option id="ash">Dry Ash Test</option>
+    		<option id="sap">Sap Analysis</option>
+    		<option id="field">Field Test</option>
+    	</select></div>
+    </div>
+
+    <div class="col-md-3  mb-0">
+        <small id="lab_no" class="form-text text-muted">Lab No</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="lab_no" id="lab_no" placeholder="Lab No"></input>
+        
+        </div>
+    </div>
+    
+    <div class="col-md-3  mb-0">
+        <small id="batch_no" class="form-text text-muted">Batch No</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="batch_no" id="batch_no" placeholder="Batch No"></input>
+            
+        </div>
+    </div>
+    <div class="col-md-3  mb-0">
+        <small id="date_sampled" class="form-text text-muted">Date Sampled</small>
+        <input data-provide="datepicker" class="form-control form-control-sm" name="date_sampled" id="datepicker" placeholder="Date Sampled" data-date-format="dd/mm/yyyy" data-date-end-date="0d" ></input>
+        <script>
+            $('#datepicker').datepicker({
+                uiLibrary: 'bootstrap4',
+                calendarWeeks: 'true',
+                todayHighlight: 'true'
+            });
+        </script>
+    </div>
+    
+    <!-- Hidden Fields for Database -->
+    <input type="hidden" class="form-control form-control-sm" name="m_user" id="m_user" placeholder="[[+modx.user.id]]" required>
+    <input type="hidden" class="form-control form-control-sm" name="client_id" id="client_id" placeholder="[[+modx.user.username]]" required>
+</div>
+
+<div class="row">
+    <div class="col-md-4 ">
+        <small id="lab_no" class="form-text text-muted">Sample ID<span class="error">*</span></small>
+        <input type="text" class="form-control form-control-sm" name="sample_id" id="sample_id" placeholder="Sample Id" required></input>
+    </div>
+    
+    <div class="col-md-4 ">
+        <small id="lab_no" class="form-text text-muted">Site ID</small>
+        <input type="text" class="form-control form-control-sm" name="site_id" id="site_id" placeholder="Paddock Id"></input>
+    </div>
+
+    [[!croptypeFORM]]
+</div>
+
+<hr class="my-2">
+
+<label class="col mb-0"><b>Analysis Inputs</b></label>
+		
+<div class="row">
+    
+    <div class=" col-md-2">
+    	<small id="ca" class="form-text text-muted">Calcium</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="ca" id="ca" placeholder="Ca - Calcium"></input>
+	    <div class="input-group-append">
+                <input class="btn btn-append" type="button" id="calcium" value="ppm" onClick="conversion(this, calcium, ca, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+
+	<div class=" col-md-2">
+	<small id="p" class="form-text text-muted">Phosphorus</small>
+        <div class="input-group input-group-sm mb-30">
+            <input type="text" class="form-control form-control-sm" name="p" id="p" placeholder="P - Phosphorus"></input>
+	    <div class="input-group-append">
+                <input class="btn btn-append" type="button" id="phosphorus" value="ppm" onClick="conversion(this, phosphorus, p, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+    
+    <div class=" col-md-2">
+	<small id="mg" class="form-text text-muted">Magnesium</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="mg" id="mg" placeholder="Mg - Magnesium"></input>
+	    <div class="input-group-append">
+                <input class="btn btn-append" type="button" id="magnesium" value="ppm" onClick="conversion(this, magnesium, mg, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+	<small id="k" class="form-text text-muted">Postassium</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="k" id="k" placeholder="K - Postassium"></input>
+	    <div class="input-group-append">
+                <input class="btn btn-append" type="button" id="postassium" value="ppm" onClick="conversion(this, postassium, k, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+    
+    <div class=" col-md-2">
+	<small id="nSmall" class="form-text text-muted">Nitrogen</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="n" id="n" placeholder="N - Nitrogen"></input>
+	    <div class="input-group-append">
+                <input class="btn btn-append" type="button" id="nitrogen" value="ppm" onClick="conversion(this, nitrogen, n, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+	<small id="s" class="form-text text-muted">Sulphur</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="s" id="s" placeholder="S - Sulphur"></input>
+	    <div class="input-group-append">
+                <input class="btn btn-append" type="button" id="sulphur" value="ppm" onClick="conversion(this, sulphur, s, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+
+</div>
+
+
+	
+<div class="row">
+	<div class=" col-md-2">
+		<small id="na" class="form-text text-muted">Soduim</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="na" id="na" placeholder="Na - Soduim"></input>
+    	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="soduim" value="ppm" onClick="conversion(this, soduim, na, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+    
+    <div class=" col-md-2">
+		<small id="b" class="form-text text-muted">Boron</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="b" id="b" placeholder="B - Boron"></input>
+    	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="boron" value="ppm" onClick="conversion(this, boron, b, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+    
+    <div class=" col-md-2">
+		<small id="zn" class="form-text text-muted">Zinc</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="zn" id="zn" placeholder="Zn - Zinc"></input>
+    	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="zinc" value="ppm" onClick="conversion(this, zinc, zn, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+    
+    <div class=" col-md-2">
+		<small id="cu" class="form-text text-muted">Copper</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="cu" id="cu" placeholder="Cu - Copper"></input>
+    	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="copper" value="ppm" onClick="conversion(this, copper, cu, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+		<small id="mn" class="form-text text-muted">Manganese</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="mn" id="mn" placeholder="Mn - Manganese"></input>
+    	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="manganese" value="ppm" onClick="conversion(this, manganese, mn, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+    
+	<div class=" col-md-2">
+		<small id="fe" class="form-text text-muted">Iron</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="fe" id="fe" placeholder="Fe - Iron"></input>
+    	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="iron" value="ppm" onClick="conversion(this, iron, fe, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+</div>
+
+<div class="row">
+	<div class=" col-md-2">
+		<small id="m" class="form-text text-muted">Molybdenum</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="m" id="m" placeholder="M - Molybdenum"></input>
+     	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="molybdenum" value="ppm" onClick="conversion(this, molybdenum, m, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+		<small id="co" class="form-text text-muted">Cobalt</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="co" id="co" placeholder="Co - Cobalt"></input>
+	 	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="cobalt" value="ppm" onClick="conversion(this, cobalt, co, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+		<small id="se" class="form-text text-muted">Selenium</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="se" id="se" placeholder="Se - Selenium"></input>
+	 	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="selenium" value="ppm" onClick="conversion(this, selenium, se, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+		<small id="ch" class="form-text text-muted">Chloride</small>
+        <div class="input-group input-group-sm mb-0">
+            <input type="text" class="form-control form-control-sm" name="ch" id="ch" placeholder="Ch - Chloride"></input>
+	 	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="chloride" value="ppm" onClick="conversion(this, chloride, cg, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+    
+</div>
+
+
+<script type="text/javascript">
+    function conversion(value, input, element, conversion) {
+        var Nvalue = document.getElementById(element.id).value;
+        var el = document.getElementById(input.id);
+        if ( el.value === "%" ) {
+            el.value = "ppm";
+            document.getElementById(element.id).value = Nvalue*conversion;
+        } else {
+            el.value = "%";
+            document.getElementById(element.id).value = Nvalue/conversion;
+        }
+    }
+</script>
+    
+	
+		
+    <button form="csvForm" type="submit" class="btn btn-success">Submit</button>
+</form>
+
+[[!newClientDetails]]
+
+<hr>
+
+<label class="col"><b>Excel/CSV Upload</b></label>
+
+<div class="input-group mt-3">
+  <div class="custom-file">
+    <input type="file" class="custom-file-input" id="CM-upload">
+    <label class="custom-file-label" for="CM-upload">Choose file</label>
+  </div>
+  <div class="input-group-append">
+    <button class="btn btn-outline-secondary" type="button" id="CM-download">Download</button>
+  </div>
+</div>
+
+<hr>
+
+<script type="text/javascript">
+    function Choice() {
+        y = document.getElementById("client_id");
+        document.getElementById("email").value = email[y.selectedIndex];
+        document.getElementById("name").value = name[y.selectedIndex];
+        document.getElementById("company").value = company[y.selectedIndex];
+        document.getElementById("site_address").value = site_address[y.selectedIndex];
+        document.getElementById("state_postcode").value = state_postcode[y.selectedIndex];
+        }
+</script>
+
+</div>
+					</div>
+
+				</div>
+
+			</main>
+			
+			<footer class="py-4 bg-light mt-auto">
+                <div class="container-fluid px-4">
+                    <div class="d-flex align-items-center justify-content-between small">
+                        <div class="text-muted">[[SimpleCopyright? &startYear=`2003`]]. All Rights Reserved <a href="[[~1]]"></a></div>
+                        <div>
+                            <a href="[[~39~]]">Privacy Policy</a>
+                            &middot;
+                            <a href="[[~39~]]">Terms &amp; Conditions</a>
+                        </div>
+                    </div>
+                </div>
+            </footer>
+            
+		</div>
+
+	</div>
+
+	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
+	<script>
+    	/*!
+            * Start Bootstrap - SB Admin v7.0.3 (https://startbootstrap.com/template/sb-admin)
+            * Copyright 2013-2021 Start Bootstrap
+            * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-sb-admin/blob/master/LICENSE)
+            */
+            // 
+        // Scripts
+        // 
+        
+        window.addEventListener('DOMContentLoaded', event => {
+        
+            // Toggle the side navigation
+            const sidebarToggle = document.body.querySelector('#sidebarToggle');
+            if (sidebarToggle) {
+                // Uncomment Below to persist sidebar toggle between refreshes
+                // if (localStorage.getItem('sb|sidebar-toggle') === 'true') {
+                //     document.body.classList.toggle('sb-sidenav-toggled');
+                // }
+                sidebarToggle.addEventListener('click', event => {
+                    event.preventDefault();
+                    document.body.classList.toggle('sb-sidenav-toggled');
+                    localStorage.setItem('sb|sidebar-toggle', document.body.classList.contains('sb-sidenav-toggled'));
+                });
+            }
+        
+        });
+
+	</script>
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js" crossorigin="anonymous"></script>
+	<script src="https://cdn.jsdelivr.net/npm/simple-datatables@latest" crossorigin="anonymous"></script>
+</body>
+</html>

+ 218 - 0
dashboard/crop-analysis/animal-dietary-balance/animal-dietary-balance.php

@@ -0,0 +1,218 @@
+<!doctype html>
+<html lang="en">
+	<head>
+		<title>[[*longtitle]] | [[++site_name]]</title>
+		<base href="[[!++site_url]]" >
+		<meta charset="[[++modx_charset]]" >
+		<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" >
+		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" >
+		<meta name="keywords" content="[[*introtext]]" >
+		<meta name="description" content="[[*description]]" >
+
+		[[!Profile]]
+		
+		[[$dash-header]]
+		
+		<link href="/client-assets/css/dashboard.css" rel="stylesheet" type="text/css" />
+		<script src="https://unpkg.com/gijgo@1.9.11/js/gijgo.min.js" type="text/javascript"></script>
+		<link href="https://unpkg.com/gijgo@1.9.11/css/gijgo.min.css" rel="stylesheet" type="text/css" />
+		<script src="client-assets/js/skycons.js" type="text/javascript"></script>
+    
+        <link href="client-assets/home/css/graphing.css" rel="stylesheet" type="text/css" media="screen" />
+        <link href="client-assets/home/css/alux.min.css" rel="stylesheet" type="text/css" media="screen" />
+        
+        <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>
+
+        <style>
+            @media print {
+                @page {
+                    size: A4 portrait;
+                }
+                @page :left {
+                    margin-left: 0.5cm;
+                }
+                @page :right {
+                    margin-right: 0.5cm;
+                }
+                @page :top {
+                    margin-top: 0cm;
+                }
+                @page :bottom {
+                    margin-bottom: 0cm;
+                }
+            }
+        </style>
+
+    </head>
+<body>
+
+<link rel="stylesheet" href="client-assets/home/css/graphPrint.css" media="print">
+
+<style>
+    .progress {
+        border-radius: 0rem !important;
+    }
+</style>
+
+<div class="container" id="content">
+    <div class="row">
+        [[!logoHeader]]
+    </div>
+
+    [[!animalAnalysisClient]]
+    
+    
+    <!-- Graph Button -->
+    <div class="d-print-none">
+        [[!animalAnalysisReportButton]]
+        <!-- <button class="btn btn-secondary downloadPDF" >Generate PDF</button> -->
+    </div>
+
+    <!-- GRAPH BANNER -->
+    
+    <div class="row">
+        <div class="col-md-12 text-center font-weight-bold h4" >ANIMAL DIETARY MINERAL BALANCE</div>
+    </div>
+
+    <hr class="p-1 m-1">
+    
+    <!-- CHART HEADER  -->
+    
+    <table class="chart">
+        <tbody>
+          <tr class="chart-header">
+            <th class="text-center col-1-7">Elements</th>
+            <th class="text-center col-1-7">Daily Intake</th>
+            <th class="text-center col-1-7">Daily Req.</th>
+            <th class="text-center col-1-7">Nutrient Bal</th>
+            <th class="text-center col-1-7">Deficit</th>
+            <th class="text-center col-1-7">Satisfactory</th>
+            <th >Surplus</th>
+          </tr>
+          
+          <tr>
+            <td class="border-left"></td>
+            <td class="border-left"></td>
+            <td class="border-left"></td>
+            <td class="border-left nutrient-balance"></td>
+            <td class="border-left"></td>
+            <td class="border-left"></td>
+            <td class="border-left border-right"></td>
+          </tr>
+          
+          [[!animalAnalysisCalcs? &element=`n`  &nutrient=`Nitrogen` &weight=`g`]]
+          [[!animalAnalysisCalcs? &element=`p`  &nutrient=`Phosphorus` &weight=`g`]]
+          [[!animalAnalysisCalcs? &element=`k`  &nutrient=`Potassium` &weight=`g`]]
+          [[!animalAnalysisCalcs? &element=`mg`  &nutrient=`Magnesium` &weight=`g`]]
+          [[!animalAnalysisCalcs? &element=`ca`  &nutrient=`Calcium` &weight=`g`]]
+          [[!animalAnalysisCalcs? &element=`na`  &nutrient=`Sodium` &weight=`g`]]
+    
+          
+          <tr>
+            <td class="text-left border-left"></td>
+            <td class="text-center border-left"></td>
+            <td class="text-center border-left"></td>
+            <td class="text-center border-left nutrient-balance"></td>
+            <td class="text-center border-left"></td>
+            <td class="text-center border-left"></td>
+            <td class="text-center border-left border-right"></td>
+          </tr>
+          
+          [[!animalAnalysisCalcs? &element=`fe` &nutrient=`Iron` &weight=`mg`]]
+          [[!animalAnalysisCalcs? &element=`mn`  &nutrient=`Manganese` &weight=`mg`]]
+          [[!animalAnalysisCalcs? &element=`zn`  &nutrient=`Zinc` &weight=``]]
+          [[!animalAnalysisCalcs? &element=`cu`  &nutrient=`Copper` &weight=`mg`]]
+          [[!animalAnalysisCalcs? &element=`b`  &nutrient=`Boron` &weight=`mg`]]
+          
+          <tr>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left nutrient-balance"></td>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left border-right"></td>
+          </tr>
+          
+          [[!animalAnalysisCalcs? &element=`mo` &nutrient=`Molybdenum` &weight=`mg`]]
+          [[!animalAnalysisCalcs? &element=`co`  &nutrient=`Colbalt` &weight=`mg`]]
+          [[!animalAnalysisCalcs? &element=`se`  &nutrient=`Selenium` &weight=`mg`]]
+          [[!animalAnalysisCalcs? &element=`ch`  &nutrient=`Chloride` &weight=`g`]]
+          
+          <tr>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left nutrient-balance"></td>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left border-right"></td>
+          </tr>
+          
+        </tbody>
+    </table>
+
+    <div class="clearfix"></div>
+    
+    <p>Note: The above assessment is for individual nutrient levels.  The influence of nutrient interations is not considered above.  Some key Nutrient Ratio Indices, which do account for these interactions, are shown below.  Although based on published calculations, they should be used with caution, as metabolic disorders can be induced by a multitude of factors, and not just these nutrient rations alone.</p>
+    
+    <div class="clearfix"></div>
+    
+    [[!animalRatios]]
+    
+    <div class="clearfix"></div>      
+    
+    <p>The normal range levels shown above are based on the minimum for either animal or plant requirement (which ever is the greater).  The following nutrient ratio indices have been calculated as requested to assist in evaluation the sutability of ths sample as a dairy feed. Although based on published calculations, hey should be useed with caution, as metabolic disorders can be induced by a multitude of factors and not just these nutrient ratios alone.</p>
+    <p><b>References:</b></p>
+    <p><ul>
+        <li>AFIA Laboratory Methods Manual v7 Appendix 2.2R(1) , p93 <a href="https://www.afia.org.au/files/pdfs/AFIA_Lab_Manual_v7.pdf">Link</a></li>
+        <li>NRC Nutrient Requirements of Dairy Cattle. National Academy Press, Washington DC. 7th Revised Edition, 2001 <a href="#">Link</a></li>
+        <li>Milk Production from Pasture – Principles and Practices. Massey University, NZ, 2002 <a href="#">Link</a></li>
+        <li>Forage Evaluation in Ruminant Nutrition. CABI, Wallingford, UK, 2000<a href="https://www.researchgate.net/profile/Khalid_Hassan10/post/Can_anybody_help_with_ruminant_nutrition_textbook2/attachment/59d6393779197b80779966e8/AS%3A400869553131522%401472586157622/download/Forage+evaluation+in+Ruminant.pdf">Link</a></li>
+    </ul></p>
+    <div class="clearfix"></div>
+    
+</div>
+
+    <!-- 
+    <script src="https://cloud.tinymce.com/stable/tinymce.min.js?apiKey=xcotawi18mg1imp8im144buq68h9g3ndd3c9c8215w8qu3ld"></script>
+    <script>
+        tinymce.init({
+            selector: 'textarea',
+            menubar: false,
+            toolbar: 'bold italic  | alignleft aligncenter alignright alignjustify | bullist numlist | removeformat',
+            plugins: 'autosave',
+            autosave_interval: '20s'
+        });
+    </script>
+    -->
+    
+    [[$dash-footer]]
+    
+    <script>
+        //https://github.com/eKoopmans/html2pdf.js
+        $('.downloadPDF').click(function () {
+        	var element = document.getElementById('content'); //document.createElement("body");
+        	element.classList.remove('screen');
+        	element.classList.add('print');
+        	var opt = {
+        		margin:       3,
+        		filename:     'soil-analysis.pdf',
+        		image:        { type: 'jpeg', quality: 1.0 },
+        		html2canvas:  { scale: 2, letterRendering: true, windowWidth: 1024 },  //, windowWidth: 1024
+        		jsPDF:        { orientation: 'portrait', unit: 'mm', format: 'a4', putOnlyUsedFonts: true, floatPrecision: 'smart', }
+        	};
+        	html2pdf()
+        	    .from(element)
+        	    .toPdf()
+        	    .set(opt)
+        	    .save()
+        	    .then(function(){
+        		    element.classList.remove('print');
+        		    element.classList.add('screen');
+        	});
+        	
+        });
+    </script>
+</body>
+</html>

+ 140 - 0
dashboard/crop-analysis/animal-dietary-balance/animal-submit.php

@@ -0,0 +1,140 @@
+<?php
+error_reporting(E_ALL);
+ini_set('display_errors', 1);
+
+$sql = null;
+//$con = mysqli_connect("localhost", "root", "R3M0T31", "cropmonitor");
+$con = mysqli_connect("localhost", "cropmonitor", "brvnCcaEYxlPCS3", "cropmonitor");
+
+//set todays date
+$date = date("Y-m-d H:i:s");
+
+//Get figures
+$email = (isset($_POST["email"])) ? $_POST["email"] : "";
+$client_name = (isset($_POST["name"])) ? $_POST["name"] : "";
+$site_address = (isset($_POST["site_address"])) ? $_POST["site_address"] : "";
+$state_postcode = (isset($_POST["state_postcode"])) ? $_POST["state_postcode"] : "";
+$analysis_type = (isset($_POST["analysis_type"])) ? $_POST["analysis_type"] : "";
+$lab_no = (isset($_POST["lab_no"])) ? $_POST["lab_no"] : "";
+$batch_no = (isset($_POST["batch_no"])) ? $_POST["batch_no"] : "";
+$date_sampled = (isset($_POST["date_sampled"])) ? $_POST["date_sampled"] : "";
+$sample_id = (isset($_POST["sample_id"])) ? $_POST["sample_id"] : "";
+$site_id = (isset($_POST["site_id"])) ? $_POST["site_id"] : "";
+$crop_type = (isset($_POST["crop_type"])) ? $_POST["crop_type"] : "";
+$n = (isset($_POST["n"])) ? $_POST["n"] : "";
+$p = (isset($_POST["p"])) ? $_POST["p"] : "";
+$k = (isset($_POST["k"])) ? $_POST["k"] : "";
+$s = (isset($_POST["s"])) ? $_POST["s"] : "";
+$mg = (isset($_POST["mg"])) ? $_POST["mg"] : "";
+$ca = (isset($_POST["ca"])) ? $_POST["ca"] : "";
+$na = (isset($_POST["na"])) ? $_POST["na"] : "";
+$fe = (isset($_POST["fe"])) ? $_POST["fe"] : "";
+$mn = (isset($_POST["mn"])) ? $_POST["mn"] : "";
+$zn = (isset($_POST["zn"])) ? $_POST["zn"] : "";
+$cu = (isset($_POST["cu"])) ? $_POST["cu"] : "";
+$b = (isset($_POST["b"])) ? $_POST["b"] : "";
+$m = (isset($_POST["m"])) ? $_POST["m"] : "";
+$co = (isset($_POST["co"])) ? $_POST["co"] : "";
+$se = (isset($_POST["se"])) ? $_POST["se"] : "";
+$ch = (isset($_POST["cl"])) ? $_POST["cl"] : "";
+// calculate meq/100g for additional calulations
+$k_meq = ( $k / 390 ) ;
+$s_meq = ( $s / 100000 * 33333 * 1.11 ) ;
+$ca_meq = ( $ca / 200 ) ;
+$mg_meq = ( $mg / 120 ) ;
+$na_meq = ( $na / 230 );
+$cl_meq = ( $cl / 100000 * 448.34 * 1.11 ) ;
+
+//$rand = substr(md5(microtime()),rand(0,26),5);
+$rand = mt_rand(10000, 99999);
+
+// Check connection
+	if (mysqli_connect_errno())
+		{
+		echo "Failed to connect to MySQL: " . mysqli_connect_error();
+		}
+		
+$sql = mysqli_query($con, "INSERT into `plant_records`
+            (
+                date,
+                email,
+                client_name,
+                site_address,
+                state_postcode,
+                analysis_type,
+                lab_no,
+                batch_no,
+                date_sampled,
+                sample_id,
+                site_id,
+                crop_type,
+                n,
+                p,
+                k,
+                s,
+                mg,
+                ca,
+                na,
+                fe,
+                mn,
+                zn,
+                cu,
+                b,
+                m,
+                co,
+                se,
+                cl,
+                k_meq,
+                s_meq,
+                ca_meq,
+                mg_meq,
+                na_meq,
+                rand
+            ) VALUES (
+                '" . $date . "',
+                '" . $email . "',
+                '" . $client_name . "',
+                '" . $site_address . "',
+                '" . $state_postcode . "',
+                '" . $analysis_type . "',
+                '" . $lab_no . "',
+                '" . $batch_no . "',
+                '" . $date_sampled . "',
+                '" . $sample_id . "',
+                '" . $site_id . "',
+                '" . $crop_type . "',
+                '" . $n . "',
+                '" . $p . "',
+                '" . $k . "',
+                '" . $s . "',
+                '" . $mg . "',
+                '" . $ca . "',
+                '" . $na . "',
+                '" . $fe . "',
+                '" . $mn . "',
+                '" . $zn . "',
+                '" . $cu . "',
+                '" . $b . "',
+                IF('" . $m . "'='',NULL,'" . $m . "'),
+                IF('" . $co . "'='',NULL,'" . $co . "'),
+                IF('" . $se . "'='',NULL,'" . $se . "'),
+                IF('" . $cl . "'='',NULL,'" . $cl . "'),
+                '" . $k_meq . "',
+                '" . $s_meq . "',
+                '" . $ca_meq . "',
+                '" . $mg_meq . "',
+                '" . $na_meq . "',
+                '" . $rand . "'
+            )" );
+$insert_id = mysqli_insert_id($con);
+            
+if ($sql === TRUE)
+	{
+	//echo "success"; //CHECKING
+	// forward to results page if successfully inserts to database
+	echo "<script>location.href = '[[~26]]?rand=" . $rand . "&cid=" . $sample_id . "&rid=" . $insert_id . "&stid=" .$crop_type . "';</script>";
+    } else {
+    die(mysqli_error($con)); // TODO: better error handling
+    //echo "User Profile incorrect";
+}
+/.

+ 161 - 0
dashboard/crop-analysis/compost-test-data/compost-test-data.php

@@ -0,0 +1,161 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+	<title>[[*longtitle]] | [[++site_name]]</title>
+	<base href="[[!++site_url]]">
+	<meta charset="[[++modx_charset]]">
+	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+	<meta name="keywords" content="[[*introtext]]">
+	<meta name="description" content="[[*description]]">
+	<link rel="icon" href="client-assets/images/favicon.ico?v=2" type="image/x-icon"> [[!Profile]]
+	
+	<script type="text/javascript">
+    	window.dataLayer = window.dataLayer || [];
+    
+    	function gtag() {
+    		dataLayer.push(arguments);
+    	}
+    	gtag('js', new Date());
+    	gtag('set', {
+    		'user_id': '[[+modx.user.id]]'
+    	}); // Set the user ID using signed-in user_id.
+    	gtag('config', 'UA-133963301-1');
+	</script>
+	
+	<link href="https://cdn.jsdelivr.net/npm/simple-datatables@latest/dist/style.css" rel="stylesheet" />
+	<link href="client-assets/css/dashboard-2021.css" rel="stylesheet" />
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/js/all.min.js" crossorigin="anonymous"></script>
+	<link href="https://cdn.datatables.net/1.10.20/css/dataTables.bootstrap4.min.css" rel="stylesheet" crossorigin="anonymous" />
+	<script src="client-assets/js/skycons.js"></script>
+	<style>
+    	.btn-append {
+    		color: #495057;
+    		background-color: #e9ecef;
+    		border: 1px solid #ced4da;
+    	}
+    	.footer {
+    		position: absolute;
+    		bottom: 0;
+    		width: 100%;
+    		height: 60px;
+    		line-height: 60px;
+    	}
+	</style>
+</head>
+
+<body class="sb-nav-fixed" id="page-top"> 
+    [[!Personalize?
+        &yesChunk=`navHeaderLogged`
+        &noChunk=`navHeader`
+        &allowedGroups=`basicClients,bacicAdmin,companyClients,companyManagers`
+    ]]
+    
+	<div id="layoutSidenav">
+	    <div id="layoutSidenav_nav">
+    		<!-- Sidebar -->
+    		[[Wayfinder?
+    		    &startId=`2` 
+        		&displayStart=`0` 
+        		&startitemTpl=`startitemTpl` 
+        		&selfClass=`show` 
+        		&level=`2`
+        		&outerTpl=`outer`
+        		    &outerClass=`sb-sidenav accordion sb-sidenav-dark`
+        		&rowTpl=`row`
+        		    &rowClass=`nav-link`
+        		&parentRowTpl=`parentRow`
+        		    &parentClass=`nav-link collapsed`
+        		&innerTpl=`inner`
+        		    &innerClass=`collapse`
+        		&innerRowTpl=`secondInner`
+        		    &innerRowClass=`nav-link`
+    		]]
+        </div>
+		
+		<div id="layoutSidenav_content">
+			<main>
+
+				<div class="container-fluid px-4">
+				    <h1 class="mt-4">[[*pagetitle]]</h1>
+
+					<ol class="breadcrumb mb-4"> [[$dash-breadcrumbs]] </ol>
+					
+					<div class="row">
+					    <div class="grid-form1">
+<h3 id="forms-example" class="">[[*longtitle]]</h3>
+
+<span class="error">* required fields.</span>
+
+<form method="post" action="[[~28~]]" >
+
+    [[!Personalize?
+        &yesChunk=`analysisLogged_Clientdetails`
+        &noChunk=`analysis_Clientdetails`
+    ]]
+
+    [[$compostAnalysisForm]]
+	
+		
+ <button type="submit" class="btn btn-success">Submit</button>
+</form>
+
+</div>
+					</div>
+
+				</div>
+
+			</main>
+			
+			<footer class="py-4 bg-light mt-auto">
+                <div class="container-fluid px-4">
+                    <div class="d-flex align-items-center justify-content-between small">
+                        <div class="text-muted">[[SimpleCopyright? &startYear=`2003`]]. All Rights Reserved <a href="[[~1]]"></a></div>
+                        <div>
+                            <a href="[[~39~]]">Privacy Policy</a>
+                            &middot;
+                            <a href="[[~39~]]">Terms &amp; Conditions</a>
+                        </div>
+                    </div>
+                </div>
+            </footer>
+            
+		</div>
+
+	</div>
+
+	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
+	<script>
+    	/*!
+            * Start Bootstrap - SB Admin v7.0.3 (https://startbootstrap.com/template/sb-admin)
+            * Copyright 2013-2021 Start Bootstrap
+            * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-sb-admin/blob/master/LICENSE)
+            */
+            // 
+        // Scripts
+        // 
+        
+        window.addEventListener('DOMContentLoaded', event => {
+        
+            // Toggle the side navigation
+            const sidebarToggle = document.body.querySelector('#sidebarToggle');
+            if (sidebarToggle) {
+                // Uncomment Below to persist sidebar toggle between refreshes
+                // if (localStorage.getItem('sb|sidebar-toggle') === 'true') {
+                //     document.body.classList.toggle('sb-sidenav-toggled');
+                // }
+                sidebarToggle.addEventListener('click', event => {
+                    event.preventDefault();
+                    document.body.classList.toggle('sb-sidenav-toggled');
+                    localStorage.setItem('sb|sidebar-toggle', document.body.classList.contains('sb-sidenav-toggled'));
+                });
+            }
+        
+        });
+
+	</script>
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js" crossorigin="anonymous"></script>
+	<script src="https://cdn.jsdelivr.net/npm/simple-datatables@latest" crossorigin="anonymous"></script>
+</body>
+</html>

+ 154 - 0
dashboard/crop-analysis/plant-test-data/generating-plant-analysis.php

@@ -0,0 +1,154 @@
+<?php
+error_reporting(E_ALL);
+//error_reporting(E_ALL ^ E_NOTICE);
+ini_set('display_errors', 1);
+$errorLog = 1;
+
+if(isset($_POST['PlantcsvForm'])) {
+    
+    if ($errorLog = "1") { error_log(print_r($_POST, true), 3, "/home/cropmonitor/public_html/site/plantformSubmit-errors.log"); }
+    
+    $sql = null;
+    $con = mysqli_connect("localhost", "cropmonitor", "brvnCcaEYxlPCS3", "cropmonitor");
+    
+    //set todays date
+    $date = date("Y-m-d H:i:s");
+    
+    // ****************************************************************************
+    // Client Details
+    $client_id = '1'; //(isset($_POST["client_id"])) ? $_POST["client_id"] : "";
+    $modx_id = '1'; //(isset($_POST["m_user"])) ? $_POST["m_user"] : "";
+    $email = (isset($_POST["email"])) ? $_POST["email"] : "";
+    $client_name = (isset($_POST["name"])) ? $_POST["name"] : "";
+    $site_address = (isset($_POST["site_address"])) ? $_POST["site_address"] : "";
+    $state_postcode = (isset($_POST["state_postcode"])) ? $_POST["state_postcode"] : "";
+
+    // Analysis Details
+    $analysis_type = (isset($_POST["analysis_type"])) ? $_POST["analysis_type"] : "";
+    $lab_no = (isset($_POST["lab_no"])) ? $_POST["lab_no"] : "";
+    $batch_no = (isset($_POST["batch_no"])) ? $_POST["batch_no"] : "";
+    $date_sampled = (isset($_POST["date_sampled"])) ? $_POST["date_sampled"] : "";
+    $sample_id = (isset($_POST["sample_id"])) ? $_POST["sample_id"] : "";
+    $site_id = (isset($_POST["site_id"])) ? $_POST["site_id"] : "";
+    $crop_type = (isset($_POST["crop_type"])) ? $_POST["crop_type"] : "";
+    
+    // Sample Details
+    $n = (isset($_POST["n"])) ? $_POST["n"] : "";
+    $p = (isset($_POST["p"])) ? $_POST["p"] : "";
+    $k = (isset($_POST["k"])) ? $_POST["k"] : "";
+    $s = (isset($_POST["s"])) ? $_POST["s"] : "";
+    $mg = (isset($_POST["mg"])) ? $_POST["mg"] : "";
+    $ca = (isset($_POST["ca"])) ? $_POST["ca"] : "";
+    $na = (isset($_POST["na"])) ? $_POST["na"] : "";
+    $fe = (isset($_POST["fe"])) ? $_POST["fe"] : "";
+    $mn = (isset($_POST["mn"])) ? $_POST["mn"] : "";
+    $zn = (isset($_POST["zn"])) ? $_POST["zn"] : "";
+    $cu = (isset($_POST["cu"])) ? $_POST["cu"] : "";
+    $b = (isset($_POST["b"])) ? $_POST["b"] : "";
+    $m = (isset($_POST["m"])) ? $_POST["m"] : "";
+    $co = (isset($_POST["co"])) ? $_POST["co"] : "";
+    $se = (isset($_POST["se"])) ? $_POST["se"] : "";
+    $ch = (isset($_POST["cl"])) ? $_POST["cl"] : "";
+    
+    //$rand = substr(md5(microtime()),rand(0,26),5);
+    $rand = mt_rand(10000, 99999);
+    
+    // Check connection
+    if (mysqli_connect_errno()){
+        echo "Failed to connect to MySQL: " . mysqli_connect_error();
+    }
+    		
+    $sql = mysqli_query($con, "INSERT into `plant_records`
+                (
+                    client_records_id,
+                    modx_user_id,
+                    date,
+                    email,
+                    client_name,
+                    site_address,
+                    state_postcode,
+                    analysis_type,
+                    lab_no,
+                    batch_no,
+                    date_sampled,
+                    sample_id,
+                    site_id,
+                    crop_type,
+                    n,
+                    p,
+                    k,
+                    s,
+                    mg,
+                    ca,
+                    na,
+                    fe,
+                    mn,
+                    zn,
+                    cu,
+                    b,
+                    m,
+                    co,
+                    se,
+                    cl,
+                    rand
+                ) VALUES (
+                    '{$client_id}',
+                    '{$modx_id}',
+                    '{$date}',
+                    '{$email}',
+                    '{$client_name}',
+                    '{$site_address}',
+                    '{$state_postcode}',
+                    '{$analysis_type}',
+                    '{$lab_no}',
+                    '{$batch_no}',
+                    '{$date_sampled}',
+                    '{$sample_id}',
+                    '{$site_id}',
+                    '{$crop_type}',
+                    '{$n}',
+                    '{$p}',
+                    '{$k}',
+                    '{$s}',
+                    '{$mg}',
+                    '{$ca}',
+                    '{$na}',
+                    '{$fe}',
+                    '{$mn}',
+                    '{$zn}',
+                    '{$cu}',
+                    '{$b}',
+                    '{$m}',
+                    '{$co}',
+                    '{$se}',
+                    '{$cl}',
+                    '{$rand}'
+                )" );
+    
+    $insert_id = mysqli_insert_id($con);
+                
+    if ($sql === TRUE) {
+        sleep(10);
+        // forward to results page if successfully inserts to database  [[~26]]
+    	echo "<script>location.href = '[[~26]]?rand=" . $rand . "&cid=" . $sample_id . "&rid=" . $insert_id . "&stid=" .$crop_type . "','_blank';</script>";
+        } else {
+        die(mysqli_error($con)); // TODO: better error handling
+        //echo "User Profile incorrect";
+    }
+}
+?>
+
+<div id="loader-gif" style="z-index:10000;" >[[$plantPOPUP]]</div>
+
+<script>
+    $(document).ready(function() {
+        $("#start-loader").click(function() {
+            $("#loader-gif").show();
+                setTimeout(function() {
+                $("#loader-gif").hide();
+            }, 5000);
+        });
+    });
+</script>
+
+

+ 252 - 0
dashboard/crop-analysis/plant-test-data/plant-analysis.php

@@ -0,0 +1,252 @@
+<!doctype html>
+<html lang="en">
+	<head>
+		<title>[[*longtitle]] | [[++site_name]]</title>
+		<base href="[[!++site_url]]" >
+		<meta charset="[[++modx_charset]]" >
+		<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" >
+		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" >
+		<meta name="keywords" content="[[*introtext]]" >
+		<meta name="description" content="[[*description]]" >
+
+		[[!Profile]]
+		
+		[[$dash-header]]
+		
+		<link href="/client-assets/css/dashboard.css" rel="stylesheet" type="text/css" />
+		<script src="https://unpkg.com/gijgo@1.9.11/js/gijgo.min.js" type="text/javascript"></script>
+		<link href="https://unpkg.com/gijgo@1.9.11/css/gijgo.min.css" rel="stylesheet" type="text/css" />
+		<script src="client-assets/js/skycons.js" type="text/javascript"></script>
+    
+        <link href="client-assets/home/css/graphing.css" rel="stylesheet" type="text/css" media="screen" />
+        <link href="client-assets/home/css/alux.min.css" rel="stylesheet" type="text/css" media="screen" />
+        
+        <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>
+
+        <style>
+            @media print {
+                @page {
+                    size: A4 portrait;
+                }
+                @page :left {
+                    margin-left: 0.5cm;
+                }
+                @page :right {
+                    margin-right: 0.5cm;
+                }
+                @page :top {
+                    margin-top: 0cm;
+                }
+                @page :bottom {
+                    margin-bottom: 0cm;
+                }
+            }
+        </style>
+
+    </head>
+<body>
+
+<title>[[*pagetitle]]</title>
+<link rel="stylesheet" href="client-assets/home/css/graphPrint.css" media="print">
+
+<style>
+    .progress {
+        border-radius: 0rem !important;
+    }
+</style>
+
+<div id="loader-gif" style="display:none; z-index:10000;" >[[$plantPOPUP]]</div>
+
+<script>
+    $(document).ready(function() {
+        $("#start-loader").click(function() {
+            $("#loader-gif").show();
+                setTimeout(function() {
+                $("#loader-gif").hide();
+            }, 5000);
+        });
+    });
+</script>
+
+<div class="container">
+    <div class="row mb-5">
+        [[!logoHeader]]
+    </div>
+    
+    [[!plantAnalysisClient]]
+
+    <!-- Graph Button -->
+    <div class="d-print-none">
+        [[!plantAnalysisReportButton]]
+    </div>
+    
+    <!-- GRAPH BANNER -->
+    
+    <div class="row">
+        <div class="col-md-12 text-center font-weight-bold h4" >ANALYSIS RESULTS</div>
+    </div>
+    
+    <hr class="p-1 m-1">
+    
+    <!-- CHART HEADER  -->
+    
+    <table class="chart">
+        <tbody>
+          <tr class="chart-header">
+            <th colspan=3 class="black text-center col-50 border-left border-right border-top">ELEMENT</th>
+            <th colspan=3 class="black text-center col-50 border-right border-top">STATUS</th>
+          </tr>
+          
+          <tr class="chart-header-sub">
+            <th class="black text-center col-16 border-bottom border-left">Elements</th>
+            <th class="black text-center col-16 border-bottom">Desired</th>
+            <th class="black text-center col-16 border-bottom">Found</th>
+            <th class="text-center col-16 stripe-1">Deficient</th>
+            <th class="text-center col-16 stripe-1">Ideal</th>
+            <th class="text-center col-16 border-right stripe-1">High</th>
+          </tr>
+          
+          <tr class="sub-chart-plant">
+            <td class="border-left"></td>
+            <td class="border-left"></td>
+            <td class="border-left nutrient-balance"></td>
+            <td class="border-left"></td>
+            <td class="border-left"></td>
+            <td class="border-left border-right"></td>
+          </tr>
+          
+          <tr class="chart-header-sub">
+            <th colspan=3 class="col-16 border-left text-center lightgreen">MAJOR ELEMENTS</th>
+            <th class="text-center col-16 border-left stripe-1"></th>
+            <th class="text-center col-16 border-left stripe-1"></th>
+            <th class="text-center col-16 border-left border-right stripe-1"></th>
+          </tr>
+          
+          [[!plantAnalysisCalcs? &element=n  &sbl=`` &nutrient=`Nitrogen` &type=`%` &min=`` &max=`` &text=`y` &graph=`progress-bar-success`]]
+          [[!plantAnalysisCalcs? &element=p  &sbl=`` &nutrient=`Phosphorus` &type=`%` &min=`` &max=`` &text=`y` &graph=`progress-bar-success`]]
+          [[!plantAnalysisCalcs? &element=k  &sbl=`` &nutrient=`Potassium` &type=`%` &min=`` &max=`` &text=`y` &graph=`progress-bar-success`]]
+          [[!plantAnalysisCalcs? &element=mg  &sbl=`` &nutrient=`Magnesium` &type=`%` &min=`` &max=`` &text=`y` &graph=`progress-bar-success`]]
+          [[!plantAnalysisCalcs? &element=ca  &sbl=`` &nutrient=`Calcium` &type=`%` &min=`` &max=`` &text=`y` &graph=`progress-bar-success`]]
+          [[!plantAnalysisCalcs? &element=na  &sbl=`` &nutrient=`Sodium` &type=`%` &min=`` &max=`` &text=`y` &graph=`progress-bar-success`]]
+    
+    <!-- Blank Graph row for seperation -->
+          <tr>
+            <td class="border-left"></td>
+            <td class="border-left"></td>
+            <td class="border-left nutrient-balance"></td>
+            <td class="border-left"></td>
+            <td class="border-left"></td>
+            <td class="border-left border-right"></td>
+          </tr>
+          
+          <tr class="chart-header-sub">
+            <th colspan=3 class="col-16 border-left text-center lightred">TRACE ELEMENTS</th>
+            <th class="text-center col-16 border-left stripe-1"></th>
+            <th class="text-center col-16 border-left stripe-1"></th>
+            <th class="text-center col-16 border-left border-right stripe-1"></th>
+          </tr>
+          
+    <!-- Blank Graph row for seperation -->
+          <tr>
+            <td class="border-left"></td>
+            <td class="border-left"></td>
+            <td class="border-left nutrient-balance"></td>
+            <td class="border-left"></td>
+            <td class="border-left"></td>
+            <td class="border-left border-right"></td>
+          </tr>
+
+          [[!plantAnalysisCalcs? &element=fe &sbl=`` &nutrient=`Iron` &type=`ppm` &min=`` &max=`` &text=`y` &graph=`progress-bar-success`]]
+          [[!plantAnalysisCalcs? &element=mn  &sbl=`` &nutrient=`Manganese` &type=`ppm` &min=`` &max=`` &text=`y` &graph=`progress-bar-success`]]
+          [[!plantAnalysisCalcs? &element=zn  &sbl=`` &nutrient=`Zinc` &type=`ppm` &min=`` &max=`` &text=`y` &graph=`progress-bar-success`]]
+          [[!plantAnalysisCalcs? &element=cu  &sbl=`` &nutrient=`Copper` &type=`ppm` &min=`` &max=`` &text=`y` &graph=`progress-bar-success`]]
+          [[!plantAnalysisCalcs? &element=b  &sbl=`` &nutrient=`Boron` &type=`ppm` &min=`` &max=`` &text=`y` &graph=`progress-bar-success`]]
+
+    <!-- Blank Graph row for seperation -->
+          <tr>
+            <td class="border-left"></td>
+            <td class="border-left"></td>
+            <td class="border-left nutrient-balance"></td>
+            <td class="border-left"></td>
+            <td class="border-left"></td>
+            <td class="border-left border-right"></td>
+          </tr>
+
+          <tr class="chart-header-sub">
+            <th colspan=3 class="col-16 border-left text-center lightpurple">MACRO ELEMENTS</th>
+            <th class="text-center col-16 border-left stripe-1"></th>
+            <th class="text-center col-16 border-left stripe-1"></th>
+            <th class="text-center col-16 border-left border-right stripe-1"></th>
+          </tr>
+          
+          [[!plantAnalysisCalcs? &element=m  &sbl=`` &nutrient=`Molybdenum` &type=`ppm` &min=`` &max=`` &text=`y` &graph=`progress-bar-success`]]
+          [[!plantAnalysisCalcs? &element=co  &sbl=`` &nutrient=`Cobalt` &type=`ppm` &min=`` &max=`` &text=`y` &graph=`progress-bar-success`]]
+          [[!plantAnalysisCalcs? &element=se  &sbl=`` &nutrient=`Selenium` &type=`ppm` &min=`` &max=`` &text=`y` &graph=`progress-bar-success`]]
+          [[!plantAnalysisCalcs? &element=cl  &sbl=`` &nutrient=`Chloride` &type=`ppm` &min=`` &max=`` &text=`y` &graph=`progress-bar-success`]]
+          [[!plantAnalysisCalcs? &element=c  &sbl=`` &nutrient=`Carbon` &type=`ppm` &min=`` &max=`` &text=`y` &graph=`progress-bar-success`]]
+          
+          <tr>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left nutrient-balance"></td>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left border-right"></td>
+          </tr>
+          
+        </tbody>
+    </table>
+
+    <div class="analysis-footer">
+        <p><i class="fa fa-envira nav_icon " style="color: green;"></i>It is always an advantage to assess tisue analysis results along with a corresponding soil analysis for more accurate diagnosis of plant nutrient status.</p>
+        <p><i class="fa fa-envira nav_icon " style="color: green;"></i>Trace element levels - manganese, copper and zinc, can all be affeced by fungicide spray residues, giving msleading results, See Comment above.</p>
+        <p><i class="fa fa-envira nav_icon " style="color: green;"></i>Talk to your qualified consultant to make a plan for correction or maintenance of the found nutrient levels.</p>
+        <p style="font-style: italic; font-size: 9px;">Desired ranges indexed from:  CSIRO Plant Anlysis Handbook 2nd Ed.  Hill Laborotories consultants guide.  PIRSA Soil and Plant Analysis.</p>
+        <p style="font-style: italic; font-size: 9px;">Any recommendationa 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>
+    </div>
+
+    
+</div>
+
+    <!-- 
+    <script src="https://cloud.tinymce.com/stable/tinymce.min.js?apiKey=xcotawi18mg1imp8im144buq68h9g3ndd3c9c8215w8qu3ld"></script>
+    <script>
+        tinymce.init({
+            selector: 'textarea',
+            menubar: false,
+            toolbar: 'bold italic  | alignleft aligncenter alignright alignjustify | bullist numlist | removeformat',
+            plugins: 'autosave',
+            autosave_interval: '20s'
+        });
+    </script>
+    -->
+    
+    [[$dash-footer]]
+    
+    <script>
+        //https://github.com/eKoopmans/html2pdf.js
+        $('.downloadPDF').click(function () {
+        	var element = document.getElementById('content'); //document.createElement("body");
+        	element.classList.remove('screen');
+        	element.classList.add('print');
+        	var opt = {
+        		margin:       3,
+        		filename:     'soil-analysis.pdf',
+        		image:        { type: 'jpeg', quality: 1.0 },
+        		html2canvas:  { scale: 2, letterRendering: true, windowWidth: 1024 },  //, windowWidth: 1024
+        		jsPDF:        { orientation: 'portrait', unit: 'mm', format: 'a4', putOnlyUsedFonts: true, floatPrecision: 'smart', }
+        	};
+        	html2pdf()
+        	    .from(element)
+        	    .toPdf()
+        	    .set(opt)
+        	    .save()
+        	    .then(function(){
+        		    element.classList.remove('print');
+        		    element.classList.add('screen');
+        	});
+        	
+        });
+    </script>
+</body>
+</html>

+ 109 - 0
dashboard/crop-analysis/plant-test-data/plant-rec-update.php

@@ -0,0 +1,109 @@
+<?php
+//Database connection
+    //$con = mysqli_connect("localhost", "root", "R3M0T31", "cropmonitor");
+    $con = mysqli_connect("localhost", "cropmonitor", "brvnCcaEYxlPCS3", "cropmonitor");
+    
+    /* check connection */
+    if (mysqli_connect_errno()) {
+        printf("Connect failed: %s\n", mysqli_connect_error());
+        exit();
+    }
+    
+    $empid =  mysqli_real_escape_string($con, $_REQUEST["empid"]);
+    $user_id = $modx->user->get('id');
+
+        $query  = "CREATE TEMPORARY TABLE `plant_temp`
+                    SELECT id, modx_user_id, plant_type, plant_stage, n_min, n_max, P_min, P_max, K_min, K_max, S_min, S_max, Ca_min, Ca_max, Mg_min, Mg_max, Na_min, Na_max, Cu_min, Cu_max, Zn_min, Zn_max, Mn_min, Mn_max, B_min, B_max, Fe_min, Fe_max, M_min, M_max, Co_min, Co_max, se_min, se_max, cl_min, cl_max, c_min, c_max 
+                    FROM `plant_specifications`
+                    WHERE `modx_user_id` = '" . $user_id . "'
+                    AND `plant_type` = '" . $empid . "'; ";
+        
+        $query .= "ALTER TABLE `plant_temp`
+                    DROP `id`, 
+                    DROP `modx_user_id`,
+                    DROP `plant_type`
+                    ; ";
+        $query .= "SELECT * FROM `plant_temp`; ";
+        
+        $result = mysqli_multi_query($con, $query);
+    
+        if ($result) {
+            do {
+                // grab the result of the next query
+                if (($result = mysqli_store_result($con)) === false && mysqli_error($con) != '') {
+                    echo "Query failed: " . mysqli_error($con);
+                }
+            } while (mysqli_more_results($con) && mysqli_next_result($con)); // while there are more results
+        } else {
+            echo "First query failed..." . mysqli_error($con);
+        }
+        
+        //get results from database
+        $all_property = array();  //declare an array for saving property
+        
+        
+        //showing property
+        echo '<div class="table-responsive text-nowrap">
+                <table class="table table-sm table-striped table-hover table-bordered">
+                <tbody>
+                    <tr>';  //initialize table tag
+                        while ($property = mysqli_fetch_field($result)) {
+                            $header = str_replace("_"," ",$property->name);
+                            echo '<th scope="col" class="text-center text-capitalize" >' . $header . '</th>';  //get field name for header
+                            array_push($all_property, $property->name);  //save those to array
+
+                        }
+                    echo '</tr>'; //end tr tag
+
+        //showing all data
+        while ($row = mysqli_fetch_array($result)) {
+            echo "<tr>";
+            foreach ($all_property as $item) {
+                if ($row[$item] == "" ) { $this_value = "0.0" ; } else { if (is_numeric($row[$item]) ) { $this_value = number_format((float)$row[$item], 2, '.', ''); } else { $this_value = $row[$item]; } }
+                echo '<td scope="row" class="text-center" contenteditable="true" onBlur="updateDatabase(this,"'. $row[$item->id] . '","' . $row['id'] . '")" onClick="showEdit(this);" >' . $this_value . '</td>'; //get items using property value
+            }
+            echo '</tr>';
+        }
+        echo "</tbody></table></div>";
+        
+        
+        echo "
+        <div class='row'>
+            <div class='col-2'>
+                <div class='row '>
+        ";
+        
+                      
+        $img_query = 'SELECT * FROM `plant_images` ORDER BY `id` DESC';
+        $img_result = mysqli_query($con, $img_query);  
+        while($img_row = mysqli_fetch_array($img_result)) {  
+            echo ' <img src="data:image/jpeg;base64,'.base64_encode($img_row['name'] ).'" class="img-thumbnail rounded float-left border-success" alt="" /> ';  
+        }
+                    
+        echo "
+                </div>
+                <br>
+                <div class='row'>
+                    <form method='post' enctype='multipart/form-data'>
+                        <div class='form-group'>  
+                            <input type='file' class='form-control-file' name='image' id='image' />  
+                        </div>
+                        <input type='submit' name='insert' id='insert' value='Insert' class='btn btn-info btn-sm' />
+                    </form>
+                </div>
+            </div>
+            
+            <div class='col-10 border border-success'>
+                <div class='row'>
+                    
+                </div> 
+            </div>
+        </div>
+        
+        ";
+
+        $query .= "DROP TEMPORARY TABLE `temp`; ";
+        
+        mysqli_query($con, $query);
+        mysqli_close($con);
+		?>

+ 282 - 0
dashboard/crop-analysis/plant-test-data/plant-recommendations.php

@@ -0,0 +1,282 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+	<title>[[*longtitle]] | [[++site_name]]</title>
+	<base href="[[!++site_url]]">
+	<meta charset="[[++modx_charset]]">
+	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+	<meta name="keywords" content="[[*introtext]]">
+	<meta name="description" content="[[*description]]">
+	<link rel="icon" href="client-assets/images/favicon.ico?v=2" type="image/x-icon"> [[!Profile]]
+	
+	<script type="text/javascript">
+    	window.dataLayer = window.dataLayer || [];
+    
+    	function gtag() {
+    		dataLayer.push(arguments);
+    	}
+    	gtag('js', new Date());
+    	gtag('set', {
+    		'user_id': '[[+modx.user.id]]'
+    	}); // Set the user ID using signed-in user_id.
+    	gtag('config', 'UA-133963301-1');
+	</script>
+	
+	<link href="https://cdn.jsdelivr.net/npm/simple-datatables@latest/dist/style.css" rel="stylesheet" />
+	<link href="client-assets/css/dashboard-2021.css" rel="stylesheet" />
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/js/all.min.js" crossorigin="anonymous"></script>
+	<link href="https://cdn.datatables.net/1.10.20/css/dataTables.bootstrap4.min.css" rel="stylesheet" crossorigin="anonymous" />
+	<script src="client-assets/js/skycons.js"></script>
+	<style>
+    	.btn-append {
+    		color: #495057;
+    		background-color: #e9ecef;
+    		border: 1px solid #ced4da;
+    	}
+    	.footer {
+    		position: absolute;
+    		bottom: 0;
+    		width: 100%;
+    		height: 60px;
+    		line-height: 60px;
+    	}
+	</style>
+</head>
+
+<body class="sb-nav-fixed" id="page-top"> 
+    [[!Personalize?
+        &yesChunk=`navHeaderLogged`
+        &noChunk=`navHeader`
+        &allowedGroups=`basicClients,bacicAdmin,companyClients,companyManagers`
+    ]]
+    
+	<div id="layoutSidenav">
+	    <div id="layoutSidenav_nav">
+    		<!-- Sidebar -->
+    		[[Wayfinder?
+    		    &startId=`2` 
+        		&displayStart=`0` 
+        		&startitemTpl=`startitemTpl` 
+        		&selfClass=`show` 
+        		&level=`2`
+        		&outerTpl=`outer`
+        		    &outerClass=`sb-sidenav accordion sb-sidenav-dark`
+        		&rowTpl=`row`
+        		    &rowClass=`nav-link`
+        		&parentRowTpl=`parentRow`
+        		    &parentClass=`nav-link collapsed`
+        		&innerTpl=`inner`
+        		    &innerClass=`collapse`
+        		&innerRowTpl=`secondInner`
+        		    &innerRowClass=`nav-link`
+    		]]
+        </div>
+		
+		<div id="layoutSidenav_content">
+			<main>
+
+				<div class="container-fluid px-4">
+				    <h1 class="mt-4">[[*pagetitle]]</h1>
+
+					<ol class="breadcrumb mb-4"> [[$dash-breadcrumbs]] </ol>
+					
+					<div class="row">
+					    <div class="container-fluid">
+    <div class="grid-form">
+        <!---->
+        <div class="grid-form1">
+            <h3>Plant Analysis</h3>
+            <p>Variables used in Plant Analysis recommendation programs.</p>
+            <div class="tab-content">
+            <!-- Company Product list here -->    
+            
+            <?php
+error_reporting(E_ALL);
+    ini_set('display_errors', 1);
+    
+    $result    = null;
+    $modx_user = $modx->user->get('id');
+    
+    /* Database connection */
+    //$con = mysqli_connect("localhost", "root", "R3M0T31", "cropmonitor");
+    $con = mysqli_connect("localhost", "cropmonitor", "brvnCcaEYxlPCS3", "cropmonitor");
+    
+    /* Check Database Connection */
+    if (mysqli_connect_errno()) {
+        printf("Connect failed: %s\n", mysqli_connect_error());
+        exit();
+    }
+    
+    /* Image Insert for Plant Identification */
+    if(isset($_POST["insert"]))  
+        {  
+            $file = addslashes(file_get_contents($_FILES["image"]["tmp_name"]));  
+            $query = "INSERT INTO plant_images(name) VALUES ('$file')";  
+            if(mysqli_query($con, $query))  
+                {  
+                    echo '<script>alert("Image saved")</script>';  
+                }  
+        }  
+?>
+
+<div class="container-fluid">
+    <div class="row">
+        <div class="form-group col-4">
+            <select id="plant" class="form-control">
+                <option value="" selected="selected">Select Plant Type</option>
+                    <?php
+                        $sql = "SELECT DISTINCT `plant_type` FROM `plant_specifications` WHERE `modx_user_id` = " . $modx_user . " ORDER BY `plant_type` ASC; ";
+                        $resultset = mysqli_query($con, $sql) or die("database error:". mysqli_error($con));
+                        while( $rows = mysqli_fetch_assoc($resultset) ) {
+                    ?>
+                <option value="<?php echo $rows["plant_type"]; ?>" "><?php echo $rows["plant_type"]; ?></option>
+                <?php $plant = $rows["plant_type"]; } ?>
+            </select>
+        </div>
+    </div>
+    
+    
+    <div class="row" id="show_product"></div>
+    
+    
+    
+    <hr>
+    <div class="row">
+        <div class="col">
+            <div class="row">
+                <p>Nutrient Requirements</p>
+            </div>
+            <div class="row">
+                <div class="col border border-success">
+                    <!-- Show Selected Plant Data Script -->
+                    <script type="text/javascript">
+                        $(document).ready(function(){
+                            // code to get all records from table via select box
+                            $("#plant").change(function() {
+                                var plant = $(this).find(":selected").val();
+                                    $.ajax({
+                                        url: '[[~89]]',
+                                        type: "POST",
+                                        data: 'empid='+ plant,
+                                        success: function(data) {
+                                            $('#show_product').html(data);
+                                    }
+                                });
+                            })
+                        });
+                    </script>
+                </div>
+            </div>
+        </div>
+    </div>
+        
+</div>
+
+
+
+<!-- Update Values Script -->
+<script type="text/javascript">
+    function showEdit(editableObj) {
+        $(editableObj).css("background", "#97e499");
+    }
+    function updateDatabase(editableObj, column, id) {
+        $(editableObj).css("background", "#FDFDFD");
+        $.ajax({
+            url: "[[~57]]",
+            type: "POST",
+            data: 'column=' + column + '&editval=' + editableObj.innerHTML + '&id=' + id,
+            success: function (data) {
+                $(editableObj).css("background", "white");
+            }
+        });
+    }
+</script>
+
+<!-- Image Insert Script -->
+<script>  
+ $(document).ready(function(){  
+      $('#insert').click(function(){  
+           var image_name = $('#image').val();  
+           if(image_name == '')  
+           {  
+                alert("Please Select Image");  
+                return false;  
+           }  
+           else  
+           {  
+                var extension = $('#image').val().split('.').pop().toLowerCase();  
+                if(jQuery.inArray(extension, ['gif','png','jpg','jpeg']) == -1)  
+                {  
+                     alert('Invalid Image File');  
+                     $('#image').val('');  
+                     return false;  
+                }  
+           }  
+      });  
+ });  
+ </script>
+ ?>
+                
+            </div>
+        </div>
+    </div>
+</div>
+					</div>
+
+				</div>
+
+			</main>
+			
+			<footer class="py-4 bg-light mt-auto">
+                <div class="container-fluid px-4">
+                    <div class="d-flex align-items-center justify-content-between small">
+                        <div class="text-muted">[[SimpleCopyright? &startYear=`2003`]]. All Rights Reserved <a href="[[~1]]"></a></div>
+                        <div>
+                            <a href="[[~39~]]">Privacy Policy</a>
+                            &middot;
+                            <a href="[[~39~]]">Terms &amp; Conditions</a>
+                        </div>
+                    </div>
+                </div>
+            </footer>
+            
+		</div>
+
+	</div>
+
+	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
+	<script>
+    	/*!
+            * Start Bootstrap - SB Admin v7.0.3 (https://startbootstrap.com/template/sb-admin)
+            * Copyright 2013-2021 Start Bootstrap
+            * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-sb-admin/blob/master/LICENSE)
+            */
+            // 
+        // Scripts
+        // 
+        
+        window.addEventListener('DOMContentLoaded', event => {
+        
+            // Toggle the side navigation
+            const sidebarToggle = document.body.querySelector('#sidebarToggle');
+            if (sidebarToggle) {
+                // Uncomment Below to persist sidebar toggle between refreshes
+                // if (localStorage.getItem('sb|sidebar-toggle') === 'true') {
+                //     document.body.classList.toggle('sb-sidenav-toggled');
+                // }
+                sidebarToggle.addEventListener('click', event => {
+                    event.preventDefault();
+                    document.body.classList.toggle('sb-sidenav-toggled');
+                    localStorage.setItem('sb|sidebar-toggle', document.body.classList.contains('sb-sidenav-toggled'));
+                });
+            }
+        
+        });
+
+	</script>
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js" crossorigin="anonymous"></script>
+	<script src="https://cdn.jsdelivr.net/npm/simple-datatables@latest" crossorigin="anonymous"></script>
+</body>
+</html>

+ 168 - 0
dashboard/crop-analysis/plant-test-data/plant-report.php

@@ -0,0 +1,168 @@
+<!doctype html>
+<html lang="en">
+	<head>
+		<title>[[*longtitle]] | [[++site_name]]</title>
+		<base href="[[!++site_url]]" >
+		<meta charset="[[++modx_charset]]" >
+		<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" >
+		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" >
+		<meta name="keywords" content="[[*introtext]]" >
+		<meta name="description" content="[[*description]]" >
+
+		[[!Profile]]
+		
+		[[$dash-header]]
+		
+		<link href="/client-assets/css/dashboard.css" rel="stylesheet" type="text/css" />
+		<script src="https://unpkg.com/gijgo@1.9.11/js/gijgo.min.js" type="text/javascript"></script>
+		<link href="https://unpkg.com/gijgo@1.9.11/css/gijgo.min.css" rel="stylesheet" type="text/css" />
+		<script src="client-assets/js/skycons.js" type="text/javascript"></script>
+    
+        <link href="client-assets/home/css/graphing.css" rel="stylesheet" type="text/css" media="screen" />
+        <link href="client-assets/home/css/alux.min.css" rel="stylesheet" type="text/css" media="screen" />
+        
+        <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>
+
+        <style>
+            @media print {
+                @page {
+                    size: A4 portrait;
+                }
+                @page :left {
+                    margin-left: 0.5cm;
+                }
+                @page :right {
+                    margin-right: 0.5cm;
+                }
+                @page :top {
+                    margin-top: 0cm;
+                }
+                @page :bottom {
+                    margin-bottom: 0cm;
+                }
+            }
+        </style>
+
+    </head>
+<body>
+
+<div class="container">
+    [[!logoHeader]]
+    [[!plantAnalysisClient]]
+
+    <div class="clearfix"></div>
+    <!-- GRAPH BANNER -->
+    
+    <div class="row">
+        <div class="col graph-header text-center">Plant Analysis Summary</div>
+    </div>
+
+    <!-- CHART HEADER  -->
+    <div class="row">
+        <div class="chart-header text-center col">General Comment</div>
+    </div>
+    <div class="row">
+        <form class="col no-pad" action="" method="post" id="general_Details" >
+            <textarea id="general_Details" name="overview">[[!general_Details]]</textarea> <input type="hidden" id="textareaID" value="general_Details" >
+            <div class="pdfHide">
+                <br>
+                <input type="submit" form="general_Details" id="general_Details" class="btn btn-success" name="general_Details" value="Save/Update">
+                <br><br>
+            </div>
+        </form>
+    </div>
+    
+    <div class="row">
+        <div class="chart-header text-center col">Recommended Remedial Program</div>
+    </div>
+    <div class="row">
+        <form class="col no-pad" action="" method="post" id="recommended_Details" >
+            <textarea id="recommended_Details" name="recommended_Details">[[!recommended_Details]]</textarea> <input type="hidden" id="textareaID" value="recommended_Details" >
+            <div class="pdfHide">
+                <br>
+                <input type="submit" form="recommended_Details" id="recommended_Details" class="btn btn-success" name="recommended_Details" value="Save/Update">
+                <br><br>
+            </div>
+        </form>
+    </div>
+    
+    <div class="row">
+        <div class="chart-header text-center col">Foliar Program</div>
+    </div>
+    <div class="row">
+        <form class="col no-pad" action="" method="post" id="foliar_Details" >
+            <textarea id="foliar_Details" name="foliar_Details">[[!foliar_Details]]</textarea> <input type="hidden" id="textareaID" value="foliar_Details" >
+            <div class="pdfHide">
+                <br>
+                <input type="submit" form="foliar_Details" id="foliar_Details" class="btn btn-success" name="foliar_Details" value="Save/Update">
+                <br><br>
+            </div>
+        </form>
+    </div>
+    
+    <p><i class="fa fa-envira nav_icon " style="color: green;"></i>It is always an advantage to assess tisue analysis results along with a corresponding soil analysis for more accurate diagnosis of plant nutrient status.</p>
+    
+    <div class="clearfix"></div>
+    
+    <p><i class="fa fa-envira nav_icon " style="color: green;"></i>Trace element levels - manganese, copper and zinc, can all be affeced by fungicide spray residues, giving msleading results, See Comment above.</p>
+    
+    <div class="clearfix"></div>
+    
+    <p><i class="fa fa-envira nav_icon " style="color: green;"></i>Talk to your qualified consultant to make a plan for correction or maintenance of the found nutrient levels.</p>
+    
+    <div class="clearfix"></div>
+    
+    <p style="font-style: italic; font-size: 9px;">Desired ranges indexed from:  CSIRO Plant Anlysis Handbook 2nd Ed.  Hill Laborotories consultants guide.  PIRSA Soil and Plant Analysis.</p>
+    
+    <div class="clearfix"></div>
+    
+    <p style="font-style: italic; font-size: 9px;">Any recommendationa provided by Cropmonitor are advice only We are not pad consultanta and we are not overed to accept responsibiliy for an 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>
+    
+    <div class="clearfix"></div>
+
+</div>
+    
+</div>
+
+    <!-- 
+    <script src="https://cloud.tinymce.com/stable/tinymce.min.js?apiKey=xcotawi18mg1imp8im144buq68h9g3ndd3c9c8215w8qu3ld"></script>
+    <script>
+        tinymce.init({
+            selector: 'textarea',
+            menubar: false,
+            toolbar: 'bold italic  | alignleft aligncenter alignright alignjustify | bullist numlist | removeformat',
+            plugins: 'autosave',
+            autosave_interval: '20s'
+        });
+    </script>
+    -->
+    
+    [[$dash-footer]]
+    
+    <script>
+        //https://github.com/eKoopmans/html2pdf.js
+        $('.downloadPDF').click(function () {
+        	var element = document.getElementById('content'); //document.createElement("body");
+        	element.classList.remove('screen');
+        	element.classList.add('print');
+        	var opt = {
+        		margin:       3,
+        		filename:     'soil-analysis.pdf',
+        		image:        { type: 'jpeg', quality: 1.0 },
+        		html2canvas:  { scale: 2, letterRendering: true, windowWidth: 1024 },  //, windowWidth: 1024
+        		jsPDF:        { orientation: 'portrait', unit: 'mm', format: 'a4', putOnlyUsedFonts: true, floatPrecision: 'smart', }
+        	};
+        	html2pdf()
+        	    .from(element)
+        	    .toPdf()
+        	    .set(opt)
+        	    .save()
+        	    .then(function(){
+        		    element.classList.remove('print');
+        		    element.classList.add('screen');
+        	});
+        	
+        });
+    </script>
+</body>
+</html>

+ 115 - 0
dashboard/crop-analysis/plant-test-data/plant-test-report.php

@@ -0,0 +1,115 @@
+<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.js" integrity="sha256-gfQwA6PlkZsLqWu4bU4hXPrbTqzixm0B5MdvBLI+Oas=" crossorigin="anonymous"></script>
+
+<div class="grid-form1">
+<h3 id="forms-example" class="">[[*longtitle]]</h3>
+
+<span class="error">* required fields.</span>
+
+[[!clientDetailsFORM]]
+
+<form method="post" action="#" id="PlantcsvForm" class="needs-validation" novalidate > <!-- ~[*id*]~] [[~28~]] -->
+
+    [[!Personalize?
+        &yesChunk=`analysisLogged_Clientdetails`
+        &noChunk=`analysis_Clientdetails`
+    ]]
+    
+    <hr>
+
+    [[$plantAnalysisForm]]
+	
+ <button form="PlantcsvForm" type="submit" name="PlantcsvForm" class="btn btn-success">Submit</button>
+</form>
+
+[[!plantformSubmit]]
+
+[[!newClientDetails]]
+
+<hr>
+
+<div class="card">
+    <div class="card-body">
+        <h5 class="card-title">Excel/CSV Upload</h5>
+        <p class="card-text">Download a csv of this form for easy filling or upload a filled form to pre-populate.</p>
+        <div class="input-group mt-3">
+            <div class="custom-file">
+                <input type="file" class="custom-file-input" id="upload">
+                <label class="custom-file-label border-success" for="upload">Choose file</label>
+            </div>
+            <div class="input-group-append">
+                <button class="btn btn-success" type="button" id="download">Download</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+</div>
+
+
+<!-- ************************ Download Form as CSV ************************ -->
+<script>
+    document.getElementById("upload").addEventListener("change", upload, false);
+    document.getElementById("download").addEventListener("click", download, false);
+    
+    function upload(e) {
+        var data = null;
+        var file = e.target.files[0];
+        var reader = new FileReader();
+        reader.readAsText(file);
+        reader.onload = function (event) {
+            var csvData = event.target.result;
+            var parsedCSV = d3.csv.parseRows(csvData);
+            parsedCSV.forEach(function (d, i) {
+                if (i == 0) return true; // skip the header
+                document.getElementById(d[0]).value = d[1];
+            });
+        }
+    }
+    
+    function download(e) {
+        data = [ ["id","value"]];
+        var f = d3.selectAll("#csvForm input, select")[0];
+        f.forEach(function(d,i){
+          	data.push([d.id, d.value]);
+        });
+        console.log(data);
+        var csvContent = "data:text/csv;charset=utf-8,";
+        data.forEach(function (d, i) {
+            dataString = d.join(",");
+            csvContent += i < data.length ? dataString + "\n" : dataString;
+        });
+        var url = window.location.pathname;
+        var filename = url.substring(url.lastIndexOf('/')+1);
+        var fname = filename.split(".")[0];
+        var today = new Date();
+        var date = today.getDate()+''+(today.getMonth()+1)+''+today.getFullYear();
+        var csvname = date+''+fname+"-plant.csv";
+    
+        var encodedUri = encodeURI(csvContent);
+        var link = document.createElement("a");
+        link.setAttribute("href", encodedUri);
+        link.setAttribute("download", csvname);
+        link.click();
+    }
+</script>
+<script type="text/javascript">
+    // JavaScript for disabling form submission if there are invalid fields
+    (function() {
+      'use strict';
+      window.addEventListener('load', function() {
+        // Fetch all the forms we want to apply custom Bootstrap validation styles to
+        var forms = document.getElementsByClassName('needs-validation');
+        // Loop over them and prevent submission
+        var validation = Array.prototype.filter.call(forms, function(form) {
+          form.addEventListener('submit', function(event) {
+            if (form.checkValidity() === false) {
+              event.preventDefault();
+              event.stopPropagation();
+            }
+            form.classList.add('was-validated');
+          }, false);
+        });
+      }, false);
+    })();
+    
+</script>

+ 33 - 364
dashboard/crop-analysis/soil-analysis.php

@@ -56,66 +56,20 @@ try {
 
 $today = date('jS F Y');
 $pageTitle = 'Soil Analysis Results - ' . $client;
-?>
-
-<!doctype html>
-<html lang="en">
-<head>
-    <title><?php echo $pageTitle; ?> | Crop Management Platform</title>
-    <base href="/" >
-    <meta charset="utf-8" >
-    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" >
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" >
-    <meta name="keywords" content="soil analysis, crop monitoring, agriculture" >
-    <meta name="description" content="Detailed soil analysis results and recommendations" >
-
-    <link rel="icon" href="client-assets/images/favicon.ico?v=2" type="image/x-icon" >
-
-    <script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
-
-    <!-- Bootstrap 5 CSS -->
-    <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">
-
-    <link href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css" rel="stylesheet" type="text/css" />
-
-    <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" />
-
-    <link type="text/css" href="/client-assets/weather-icons/css/weather-icons.min.css?version=1.16" rel="stylesheet" type="text/css" />
-    <link href="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/magnific-popup.css" rel="stylesheet" type="text/css" />
-        <script src="https://unpkg.com/gijgo@1.9.11/js/gijgo.min.js" type="text/javascript"></script>
-        <link href="https://unpkg.com/gijgo@1.9.11/css/gijgo.min.css" rel="stylesheet" type="text/css" />
-        <script src="client-assets/js/skycons.js" type="text/javascript"></script>
-
-        <link href="client-assets/home/css/graphing.css" rel="stylesheet" type="text/css" media="screen" />
-        <link href="client-assets/home/css/alux.min.css" rel="stylesheet" type="text/css" media="screen" />
-
-        <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>
-
-        <style>
-            @media print {
-                @page {
-                    size: A4 portrait;
-                }
-                @page :left {
-                    margin-left: 0.5cm;
-                }
-                @page :right {
-                    margin-right: 0.5cm;
-                }
-                @page :top {
-                    margin-top: 0cm;
-                }
-                @page :bottom {
-                    margin-bottom: 0cm;
-                }
-            }
-        </style>
+$siteName = 'Crop Management Platform';
+$activeItem = 'Soil Analysis';
 
-    </head>
-    <body>
+include __DIR__.'/../../layouts/header.php';
+include __DIR__.'/../../layouts/navbar.php';
+?>
 
-        <div class="container">
-            <div class="row">
+<div id="layoutSidenav">
+    <div id="layoutSidenav_nav">
+        <?php include __DIR__.'/../../layouts/sidebar.php'; ?>
+    </div>
+    <div id="layoutSidenav_content">
+        <main>
+            <div class="container-fluid px-4">            <div class="row">
                 <?php
                 // Replace Logo with Customer Logo if supplied.
                 $client = '';
@@ -296,13 +250,29 @@ $pageTitle = 'Soil Analysis Results - ' . $client;
                 </div>
 
             </form>
-        </div>    
+        </div>
+    </main>
 
+    <footer class="py-4 bg-light mt-auto">
+        <div class="container-fluid px-4">
+            <div class="d-flex align-items-center justify-content-between small">
+                <div class="text-muted">&copy; <?= date('Y') ?> Crop Management Platform. All Rights Reserved.</div>
+                <div><a href="/privacy-policy.php">Privacy Policy</a> &middot; <a href="/terms.php">Terms &amp; Conditions</a></div>
+            </div>
+        </div>
+    </footer>
+</div>
+</div>
+
+<?php include __DIR__.'/../../layouts/footer.php'; ?>
 
+<script>
+function generateGraph() {
+    alert('Graph generation functionality will be implemented here.');
+}
 
-        <script type="text/javascript">
-            $(document).ready(function(){
-                var timeoutId;
+$(document).ready(function(){
+    var timeoutId;
                 $('form textarea, form input').on('input propertychange change', function() {
                     console.log('Textarea Change');
 
@@ -340,306 +310,5 @@ $pageTitle = 'Soil Analysis Results - ' . $client;
                     e.preventDefault();
                 });
             });
-        </script>
-
-        </div>
-
-    <!-- 
-<script src="https://cloud.tinymce.com/stable/tinymce.min.js?apiKey=xcotawi18mg1imp8im144buq68h9g3ndd3c9c8215w8qu3ld"></script>
-<script>
-tinymce.init({
-selector: 'textarea',
-menubar: false,
-toolbar: 'bold italic  | alignleft aligncenter alignright alignjustify | bullist numlist | removeformat',
-plugins: 'autosave',
-autosave_interval: '20s'
-});
-</script>
--->
-
-    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
-    <script type="text/javascript" src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script>
-    <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>
-    <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>
-
-    <script type="text/javascript">
-        addEventListener("load", function() {
-            setTimeout(hideURLbar, 0);
-        }, false);
-        function hideURLbar(){
-            window.scrollTo(0,1);
-        }
-    </script>
-
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.js"></script>
-    <script src="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/jquery.magnific-popup.js"></script>
-
-    <script>
-        function generateGraph() {
-            alert('Graph generation functionality will be implemented here.');
-        }
-    </script>
-
-    <script>
-        //https://github.com/eKoopmans/html2pdf.js
-        $('.downloadPDF').click(function () {
-            var element = document.getElementById('content'); //document.createElement("body");
-            element.classList.remove('screen');
-            element.classList.add('print');
-            var opt = {
-                margin:       3,
-                filename:     'soil-analysis.pdf',
-                image:        { type: 'jpeg', quality: 1.0 },
-                html2canvas:  { scale: 2, letterRendering: true, windowWidth: 1024 },  //, windowWidth: 1024
-                jsPDF:        { orientation: 'portrait', unit: 'mm', format: 'a4', putOnlyUsedFonts: true, floatPrecision: 'smart', }
-            };
-            html2pdf()
-                .from(element)
-                .toPdf()
-                .set(opt)
-                .save()
-                .then(function(){
-                element.classList.remove('print');
-                element.classList.add('screen');
-            });
-
-        });
-    </script>
-    </body>
-</html>
-
-<link rel="stylesheet" href="client-assets/home/css/graphPrint.css" media="print">
-
-<style>
-    .progress {
-        border-radius: 0rem !important;
-    }
-</style>
-
-<div class="container" id="content">
-    <div class="row">
-        [[!logoHeader]]
-    </div>
-
-    [[!soilAnalysisClient]]
-
-
-    <!-- Graph Button -->
-    <div class="d-print-none">
-        [[!soilAnalysisReportButton]]
-        <!-- <button class="btn btn-secondary downloadPDF" >Generate PDF</button> -->
-    </div>
-
-    <!-- GRAPH BANNER -->
-
-    <div class="row">
-        <div class="col-md-12 text-center font-weight-bold h4" >ANALYSIS RESULTS</div>
-    </div>
-
-    <hr class="p-1 m-1">
-
-    <!-- CHART HEADER  -->
-    <table class="chart">
-        <tbody>
-            <tr class="chart-header">
-                <th colspan=3 class="text-center col-md-6 border-left border-right border-top">ELEMENT</th>
-                <th colspan=3 class="text-center col-md-6 border-right border-top">STATUS</th>
-            </tr>
-
-            <tr class="chart-header-sub">
-                <th class="text-center col-18 border-left"></th>
-                <th class="text-center col-15">DESIRED</th>
-                <th class="text-center col-15">FOUND</th>
-                <th class="text-center col-16 stripe-1">LIGHT</th>
-                <th class="text-center col-16 stripe-1">MEDIUM</th>
-                <th class="text-center col-16 border-right stripe-1">HEAVY</th>
-            </tr>
-
-            <tr>
-                <td class="border-left"></td>
-                <td class="border-left"></td>
-                <td class="border-left nutrient-balance"></td>
-                <td class="border-left"></td>
-                <td class="border-left"></td>
-                <td class="border-left border-right"></td>
-            </tr>
-
-            [[!soilAnalysisCalcs? &element=cec &sbl=`` &nutrient=`CEC` &min=`` &max=`` &text=`` &recV=`n` &decimal=`2` &graph=lightorangeGraph]]
-            [[!soilAnalysisCalcs? &element=tec &sbl=`` &nutrient=`TEC` &min=`` &max=`soil_type` &text=`` &recV=`max` &rec_text=`c` &decimal=`2` &graph=lightorangeGraph]]
-
-            <tr class="chart-header-sub">
-                <th class="text-center col-18 border-left text-dark bg-white"></th>
-                <th class="text-center col-15 border-left text-dark bg-white"></th>
-                <th class="text-center col-15 border-left nutrient-balance"></th>
-                <th class="text-center col-16 border-left stripe-1">DEFICIT</th>
-                <th class="text-center col-16 stripe-1">IDEAL</th>
-                <th class="text-center col-16 border-right stripe-1">HIGH</th>
-            </tr>
-
-            [[!soilAnalysisCalcs? &element=ph_h2o  &sbl=`` &nutrient=`pH-level (H20)` &type=`pH` &min=`` &max=`` &text=`` &recV=`ph` &decimal=`1` &graph=lightorangeGraph]]
-            [[!soilAnalysisCalcs? &element=ph_cacl2  &sbl=`` &nutrient=`pH-level (CaCl2)` &type=`pH` &min=`` &max=`` &text=`` &recV=`n` &decimal=`1` &graph=lightorangeGraph]]
-            [[!soilAnalysisCalcs? &element=ec &sbl=`` &nutrient=`Conductivity (EC)` &type=`mS/cm`  &min=`` &max=`` &text=`` &decimal=`2` &graph=lightorangeGraph]]
-            [[!soilAnalysisCalcs? &element=ocarbon  &sbl=`` &nutrient=`Organic Carbon` &type=`%` &min=`` &max=`` &text=`` &decimal=`1` &graph=lightorangeGraph]]
-            [[!soilAnalysisCalcs? &element=omatter  &sbl=`` &nutrient=`Organic Matter` &type=`%` &min=`` &max=`` &text=`` &decimal=`1` &graph=lightorangeGraph]]
-
-            <tr class="chart-header-sub">
-                <th colspan=3 class="col-16 border-left text-center lightgreen">MAJOR ELEMENTS</th>
-                <th class="text-center col-16 stripe-1"></th>
-                <th class="text-center col-16 stripe-1"></th>
-                <th class="text-center col-16 border-right stripe-1"></th>
-            </tr>
-
-            [[!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]]
-            [[!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]]
-            <!-- [!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]]
-[!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]]
-[!soilAnalysisCalcs? &element=`p_morgan`  &sbl=`P` &nutrient=`Phosphate <small>(morgan)</small>` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`0` &graph=lightgreenGraph]] -->
-            [[!soilAnalysisCalcs? &element=`p_colwell`  &sbl=`P` &nutrient=`Phosphate <small>(colwell)</small>` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`0` &graph=lightgreenGraph]]
-
-            [[!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]]
-            [[!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]]
-            [[!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]]
-            [[!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]]
-
-            <tr class="chart-header-sub">
-                <th colspan=3 class="col-16 border-left text-center lightred">TRACE ELEMENTS</th>
-                <th class="text-center col-16 stripe-1"></th>
-                <th class="text-center col-16 stripe-1"></th>
-                <th class="text-center col-16 border-right stripe-1"></th>
-            </tr>
-
-            [[!soilAnalysisCalcs? &element=s_morgan  &sbl=`S` &nutrient=`Sulfur` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`2` &graph=lightredGraph]]
-            [[!soilAnalysisCalcs? &element=b_cacl2  &sbl=`B` &nutrient=`Boron` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`2` &graph=lightredGraph]]
-            [[!soilAnalysisCalcs? &element=mn_dtpa  &sbl=`Mn` &nutrient=`Manganese` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`2` &graph=lightredGraph]]
-            [[!soilAnalysisCalcs? &element=cu_dtpa  &sbl=`Cu` &nutrient=`Copper` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`2` &graph=lightredGraph]]
-            [[!soilAnalysisCalcs? &element=zn_dtpa  &sbl=`Zn` &nutrient=`Zinc` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`2` &graph=lightredGraph]]
-            [[!soilAnalysisCalcs? &element=fe_dtpa  &sbl=`Ir` &nutrient=`Iron` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`2` &graph=lightredGraph]]
-            [[!soilAnalysisCalcs? &element=al  &sbl=`Al` &nutrient=`Aluminium` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`2` &graph=lightredGraph]]
-            [[!soilAnalysisCalcs? &element=sl_cacl2  &sbl=`Si` &nutrient=`Silicon` &min=`` &max=`` &type=ppm &text=`c` &rec_text=`r` &decimal=`2` &graph=lightredGraph]]
-
-            <tr class="chart-header-sub">
-                <th colspan=3 class="col-16 border-left text-center lightpurple">BASE SATURATION</th>
-                <th class="text-center col-16 stripe-1"></th>
-                <th class="text-center col-16 stripe-1"></th>
-                <th class="text-center col-16 border-right stripe-1"></th>
-            </tr>
-
-            [[!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]]
-            [[!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]]
-            [[!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]]
-            [[!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]]
-            [[!soilAnalysisCalcs? &element=`BS_ob` &sbl=`` &nutrient=`Other Bases` &min=`` &max=`ob_rec` &type=`%` &text=`c` &rec_text=`r` &recV=`max` &decimal=`2` &graph=lightpurpleGraph]]
-            [[!soilAnalysisCalcs? &element=`BS_h` &sbl=`` &nutrient=`Hydrogen` &min=`` &max=`h_rec` &type=`%` &text=`c` &rec_text=`r` &recV=`max` &decimal=`2` &graph=lightpurpleGraph]]
-
-            <tr class="chart-header-sub">
-                <th colspan=3 class="col-16 border-left text-center lightgrey">SOLUBLE MORGAN 2 EXTRACT</th>
-                <th class="text-center col-16 stripe-1"></th>
-                <th class="text-center col-16 stripe-1"></th>
-                <th class="text-center col-16 border-right stripe-1"></th>
-            </tr>
-
-            [[!soilAnalysisCalcs? &element=s_morgan  &sbl=`Ca` &nutrient=`Calcium` &min=`` &max=`` &type=`%` &text=`c` &rec_text=`r` &decimal=`0` &graph=lightgreyGraph]]
-            [[!soilAnalysisCalcs? &element=b_cacl2  &sbl=`Mg` &nutrient=`Magnesium` &min=`` &max=`` &type=`%` &text=`c` &rec_text=`r` &decimal=`0` &graph=lightgreyGraph]]
-            [[!soilAnalysisCalcs? &element=mn_dtpa  &sbl=`K` &nutrient=`Potassium` &min=`` &max=`` &type=`%` &text=`c` &rec_text=`r` &decimal=`0` &graph=lightgreyGraph]]
-
-
-
-            <tr class="chart-header-sub">
-                <th colspan=3 class="col-16 border-left text-center lightgrey">ADDITIONAL DATA</th>
-                <th class="text-center col-16 stripe-1">LOW</th>
-                <th class="text-center col-16 stripe-1">IDEAL</th>
-                <th class="text-center col-16 border-right stripe-1">EXCELLENT</th>
-            </tr>
-
-            [[!soilAnalysisCalcs? &element=s_morgan  &sbl=`Ca` &nutrient=`Calcium` &min=`` &max=`` &type=`%` &text=`c` &rec_text=`r` &decimal=`0` &graph=lightgreyGraph]]
-
-            <tr class="chart-header-sub">
-                <th colspan=3 class="col-16 border-left text-center lightblue">RATIOS</th>
-                <th class="text-center col-16 stripe-1"></th>
-                <th class="text-center col-16 stripe-1"></th>
-                <th class="text-center col-16 border-right stripe-1"></th>
-            </tr>
-
-            [[!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]]
-            [[!soilAnalysisCalcs? &element=NH3_N  &sbl=`` &nutrient=`Total Nitrogen` &type=`%` &min=`` &max=`` &text=`c` &rec_text=`r` &decimal=`1` &graph=lightblueGraph]]
-            [[!soilAnalysisCalcs? &element=ocarbon  &sbl=`` &nutrient=`Total Carbon` &type=`%` &min=`` &max=`` &text=`c` &rec_text=`r` &decimal=`1` &graph=lightblueGraph]]
-            [[!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]]
-
-
-            <tr>
-                <td class="border-bottom border-left"></td>
-                <td class="border-bottom border-left"></td>
-                <td class="border-bottom border-left nutrient-balance"></td>
-                <td class="border-bottom border-left"></td>
-                <td class="border-bottom border-left"></td>
-                <td class="border-bottom border-left border-right"></td>
-            </tr>
-        </tbody>
-    </table>
-
-    <div class="analysis-footer">
-        <div class="col text-center">&copy; 2008-[[!date?format=year]] Cropmonitor</div>
-    </div>
-</div>
-
-</div>
-
-<!-- 
-<script src="https://cloud.tinymce.com/stable/tinymce.min.js?apiKey=xcotawi18mg1imp8im144buq68h9g3ndd3c9c8215w8qu3ld"></script>
-<script>
-tinymce.init({
-selector: 'textarea',
-menubar: false,
-toolbar: 'bold italic  | alignleft aligncenter alignright alignjustify | bullist numlist | removeformat',
-plugins: 'autosave',
-autosave_interval: '20s'
-});
-</script>
--->
-
-<!-- jQuery first, then Popper.js, then Bootstrap JS -->
-<script type="text/javascript" src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js" integrity="sha256-VazP97ZCwtekAsvgPBSUwPFKdrwD3unUfSGVYrahUqU=" crossorigin="anonymous"></script>
-<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>
-<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>	
-
-<script type="text/javascript">
-    addEventListener("load", function() { 
-        setTimeout(hideURLbar, 0);
-    }, false);
-    function hideURLbar(){ 
-        window.scrollTo(0,1);
-    }
-</script>
-
-<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.bundle.min.js" integrity="sha384-xrRywqdh3PHs8keKZN+8zzc5TX0GRTLCcmivcbNJWm2rs5C8PRhcEn3czEjhAO9o" crossorigin="anonymous"></script>
-
-<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.js"></script>
-<script src="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/jquery.magnific-popup.js"></script>
-
-<script>
-    //https://github.com/eKoopmans/html2pdf.js
-    $('.downloadPDF').click(function () {
-        var element = document.getElementById('content'); //document.createElement("body");
-        element.classList.remove('screen');
-        element.classList.add('print');
-        var opt = {
-            margin:       3,
-            filename:     'soil-analysis.pdf',
-            image:        { type: 'jpeg', quality: 1.0 },
-            html2canvas:  { scale: 2, letterRendering: true, windowWidth: 1024 },  //, windowWidth: 1024
-            jsPDF:        { orientation: 'portrait', unit: 'mm', format: 'a4', putOnlyUsedFonts: true, floatPrecision: 'smart', }
-        };
-        html2pdf()
-            .from(element)
-            .toPdf()
-            .set(opt)
-            .save()
-            .then(function(){
-            element.classList.remove('print');
-            element.classList.add('screen');
-        });
-
-    });
 </script>
-</body>
-</html> 
+            

+ 2 - 0
dashboard/crop-analysis/soil-test-data.php

@@ -1,4 +1,6 @@
 <?php
+error_reporting(E_ALL);
+ini_set('display_errors', 1);
 
 
 // dashboard/crop-analysis/soil-test-data.php

+ 292 - 0
dashboard/crop-analysis/water-test-data/water-analysis-pdf.php

@@ -0,0 +1,292 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+	<title>[[*longtitle]] | [[++site_name]]</title>
+	<base href="[[!++site_url]]">
+	<meta charset="[[++modx_charset]]">
+	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+	<meta name="keywords" content="[[*introtext]]">
+	<meta name="description" content="[[*description]]">
+	<link rel="icon" href="client-assets/images/favicon.ico?v=2" type="image/x-icon"> [[!Profile]]
+	
+	<script type="text/javascript">
+    	window.dataLayer = window.dataLayer || [];
+    
+    	function gtag() {
+    		dataLayer.push(arguments);
+    	}
+    	gtag('js', new Date());
+    	gtag('set', {
+    		'user_id': '[[+modx.user.id]]'
+    	}); // Set the user ID using signed-in user_id.
+    	gtag('config', 'UA-133963301-1');
+	</script>
+	
+	<link href="https://cdn.jsdelivr.net/npm/simple-datatables@latest/dist/style.css" rel="stylesheet" />
+	<link href="client-assets/css/dashboard-2021.css" rel="stylesheet" />
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/js/all.min.js" crossorigin="anonymous"></script>
+	<link href="https://cdn.datatables.net/1.10.20/css/dataTables.bootstrap4.min.css" rel="stylesheet" crossorigin="anonymous" />
+	<script src="client-assets/js/skycons.js"></script>
+	<style>
+    	.btn-append {
+    		color: #495057;
+    		background-color: #e9ecef;
+    		border: 1px solid #ced4da;
+    	}
+    	.footer {
+    		position: absolute;
+    		bottom: 0;
+    		width: 100%;
+    		height: 60px;
+    		line-height: 60px;
+    	}
+	</style>
+</head>
+
+<body class="sb-nav-fixed" id="page-top"> 
+    [[!Personalize?
+        &yesChunk=`navHeaderLogged`
+        &noChunk=`navHeader`
+        &allowedGroups=`basicClients,bacicAdmin,companyClients,companyManagers`
+    ]]
+    
+	<div id="layoutSidenav">
+	    <div id="layoutSidenav_nav">
+    		<!-- Sidebar -->
+    		[[Wayfinder?
+    		    &startId=`2` 
+        		&displayStart=`0` 
+        		&startitemTpl=`startitemTpl` 
+        		&selfClass=`show` 
+        		&level=`2`
+        		&outerTpl=`outer`
+        		    &outerClass=`sb-sidenav accordion sb-sidenav-dark`
+        		&rowTpl=`row`
+        		    &rowClass=`nav-link`
+        		&parentRowTpl=`parentRow`
+        		    &parentClass=`nav-link collapsed`
+        		&innerTpl=`inner`
+        		    &innerClass=`collapse`
+        		&innerRowTpl=`secondInner`
+        		    &innerRowClass=`nav-link`
+    		]]
+        </div>
+		
+		<div id="layoutSidenav_content">
+			<main>
+
+				<div class="container-fluid px-4">
+				    <h1 class="mt-4">[[*pagetitle]]</h1>
+
+					<ol class="breadcrumb mb-4"> [[$dash-breadcrumbs]] </ol>
+					
+					<div class="row">
+					    [[!pdf-header]]
+
+<div class="grid">
+    [[!logoHeader]]
+    [[!waterAnalysisClient]]
+    
+    <div class="clearfix"></div>
+    
+    
+    <!-- GRAPH BANNER -->
+    
+    <div class="nav-wrap">
+        <div class="graph-header text-center" style="width: 100%;">ANALYSIS RESULTS</div>
+    </div>
+    
+    <div class="clearfix"></div>
+    <hr>
+    
+    <!-- CHART HEADER  -->
+    
+    <table class="chart">
+        <tbody>
+          <tr class="chart-header">
+            <th colspan=3 class="black text-center col-50 border-left border-right border-top">ELEMENT</th>
+            <th colspan=3 class="black text-center col-50 border-right border-top">STATUS</th>
+          </tr>
+          
+          <tr class="chart-header-sub">
+            <th class="black text-center col-16 border-bottom border-left"></th>
+            <th class="black text-center col-16 border-bottom">DESIRED</th>
+            <th class="black text-center col-16 border-bottom">FOUND</th>
+            <th class="text-center col-16 border-left stripe-1">LIGHT</th>
+            <th class="text-center col-16 border-left stripe-1">MEDIUM</th>
+            <th class="text-center col-16 border-left border-right stripe-1">HEAVY</th>
+          </tr>
+          
+          <tr>
+            <td class="border-left"></td>
+            <td class="border-left"></td>
+            <td class="border-left nutrient-balance"></td>
+            <td class="border-left"></td>
+            <td class="border-left"></td>
+            <td class="border-left border-right"></td>
+          </tr>
+          
+          [[!waterAnalysisCalcs? &element=cec  &nutrient=`CEC` &graph=lightorangeGraph]]
+          [[!waterAnalysisCalcs? &element=tec  &nutrient=`TEC` &graph=lightorangeGraph]]
+          
+          <tr class="chart-header-sub">
+            <th class="text-center col-16 border-left white"></th>
+            <th class="text-center col-16 border-left white"></th>
+            <th class="text-center col-16 border-left nutrient-balance"></th>
+            <th class="text-center col-16 border-left stripe-1">DEFICIT</th>
+            <th class="text-center col-16 border-left stripe-1">IDEAL</th>
+            <th class="text-center col-16 border-left border-right stripe-1">HIGH</th>
+          </tr>
+          
+          [[!waterAnalysisCalcs? &element=ph_h2o  &nutrient=`pH-level (H20)` &graph=lightorangeGraph]]
+          [[!waterAnalysisCalcs? &element=ph_cacl2  &nutrient=`pH-level (CaCl2)` &graph=lightorangeGraph]]
+          [[!waterAnalysisCalcs? &element=ocarbon  &nutrient=`Organic Carbon` &graph=lightorangeGraph]]
+          [[!waterAnalysisCalcs? &element=omatter  &nutrient=`Organic Matter` &graph=lightorangeGraph]]
+        
+          <tr class="chart-header-sub">
+            <th colspan=3 class="col-16 border-left text-center lightblue">RATIOS</th>
+            <th class="text-center col-16 border-left stripe-1"></th>
+            <th class="text-center col-16 border-left stripe-1"></th>
+            <th class="text-center col-16 border-left border-right stripe-1"></th>
+          </tr>
+          
+          [[!soilAnalysisRatio? &element=`ca_mehlick3` &elementTwo=`mg_mehlick3`  &rec=`ca_mg_ratio` &nutrient=`Ca:Mg Ratio` &graph=lightblueGraph]]
+          [[!waterAnalysisCalcs? &element=NH3_N  &nutrient=`Total Nitrogen` &type=`%` &graph=lightblueGraph]]
+          [[!waterAnalysisCalcs? &element=p_mehlick  &nutrient=`Total Carbon` &type=`%` &graph=lightblueGraph]]
+          [[!soilAnalysisRatio? &element=`p_bray2` &elementTwo=`NO3_N` &rec=`c_n_ratio` &nutrient=`C:N Ratio` &graph=lightblueGraph]]
+          
+         
+          <tr class="chart-header-sub">
+            <th colspan=3 class="col-16 border-left text-center lightgreen">MAJOR ELEMENTS</th>
+            <th class="text-center col-16 border-left stripe-1"></th>
+            <th class="text-center col-16 border-left stripe-1"></th>
+            <th class="text-center col-16 border-left border-right stripe-1"></th>
+          </tr>
+          
+          [[!waterAnalysisCalcs? &element=NO3_N  &nutrient=`Nitrate Nitrogen` &type=ppm &graph=lightgreenGraph]]
+          [[!waterAnalysisCalcs? &element=NH3_N  &nutrient=`Ammonium Nitrogen` &type=ppm &graph=lightgreenGraph]]
+          [[!waterAnalysisCalcs? &element=p_mehlick  &nutrient=`Phosphorus (mehlick III)` &type=ppm &graph=lightgreenGraph]]
+          [[!waterAnalysisCalcs? &element=p_bray2  &nutrient=`Phosphorus (Bray 2)` &type=ppm &graph=lightgreenGraph]]
+          [[!waterAnalysisCalcs? &element=p_morgan  &nutrient=`Phosphate (morgan)` &type=ppm &graph=lightgreenGraph]]
+        
+          <tr class="chart-header-sub">
+            <th colspan=3 class="col-16 border-left text-center lightred">TRACE ELEMENTS</th>
+            <th class="text-center col-16 border-left stripe-1"></th>
+            <th class="text-center col-16 border-left stripe-1"></th>
+            <th class="text-center col-16 border-left border-right stripe-1"></th>
+          </tr>
+          
+          [[!waterAnalysisCalcs? &element=s_morgan  &nutrient=`Sulfur` &type=ppm &graph=lightredGraph]]
+          [[!waterAnalysisCalcs? &element=b_cacl2  &nutrient=`Boron` &type=ppm &graph=lightredGraph]]
+          [[!waterAnalysisCalcs? &element=mn_dtpa  &nutrient=`Manganese` &type=ppm &graph=lightredGraph]]
+          [[!waterAnalysisCalcs? &element=cu_dtpa  &nutrient=`Copper` &type=ppm &graph=lightredGraph]]
+          [[!waterAnalysisCalcs? &element=zn_dtpa  &nutrient=`Zinc` &type=ppm &graph=lightredGraph]]
+          [[!waterAnalysisCalcs? &element=fe_dtpa  &nutrient=`Iron` &type=ppm &graph=lightredGraph]]
+          [[!waterAnalysisCalcs? &element=al  &nutrient=`Aluminium` &type=ppm &graph=lightredGraph]]
+          [[!waterAnalysisCalcs? &element=sl_cacl2  &nutrient=`Silicon` &type=ppm &graph=lightredGraph]]
+        
+          <tr class="chart-header-sub">
+            <th colspan=3 class="col-16 border-left text-center lightpurple">BASE SATURATION</th>
+            <th class="text-center col-16 border-left stripe-1"></th>
+            <th class="text-center col-16 border-left stripe-1"></th>
+            <th class="text-center col-16 border-left border-right stripe-1"></th>
+          </tr>
+          
+          [[!waterAnalysisCalcs? &element=`BS_ca2`  &nutrient=`Calcium` &type=`%` &graph=lightpurpleGraph]]
+          [[!waterAnalysisCalcs? &element=`BS_mg2`  &nutrient=`Magnesium` &type=`%` &graph=lightpurpleGraph]]
+          [[!waterAnalysisCalcs? &element=`BS_k`  &nutrient=`Potassium` &type=`%` &graph=lightpurpleGraph]]
+          [[!waterAnalysisCalcs? &element=`BS_na`  &nutrient=`Sodium` &type=`%` &graph=lightpurpleGraph]]
+          [[!waterAnalysisCalcs? &element=`BS_al3`  &nutrient=`Other Bases` &type=`%` &graph=lightpurpleGraph]]
+          [[!waterAnalysisCalcs? &element=`BS_h`  &nutrient=`Hydrogen` &type=`%` &graph=lightpurpleGraph]]
+          
+          <tr class="chart-header-sub">
+            <th colspan=3 class="col-16 border-left text-center lightgrey">SOLUBLE MORGAN 2 EXTRACT</th>
+            <th class="text-center col-16 border-left stripe-1"></th>
+            <th class="text-center col-16 border-left stripe-1"></th>
+            <th class="text-center col-16 border-left border-right stripe-1"></th>
+          </tr>
+          
+          [[!waterAnalysisCalcs? &element=s_morgan  &nutrient=`Calcium` &type=`%` &graph=lightgreyGraph]]
+          [[!waterAnalysisCalcs? &element=b_cacl2  &nutrient=`Magnesium` &type=`%` &graph=lightgreyGraph]]
+          [[!waterAnalysisCalcs? &element=mn_dtpa  &nutrient=`Potassium` &type=`%` &graph=lightgreyGraph]]
+
+          <tr class="chart-header-sub">
+            <th colspan=3 class="col-16 border-left text-center lightgrey">ADDITIONAL DATA</th>
+            <th class="text-center col-16 border-left stripe-1">LOW</th>
+            <th class="text-center col-16 border-left stripe-1">IDEAL</th>
+            <th class="text-center col-16 border-left border-right stripe-1">EXCELLENT</th>
+          </tr>
+          
+          [[!waterAnalysisCalcs? &element=s_morgan  &nutrient=`Calcium` &type=`%` &graph=lightgreyGraph]]
+
+          <tr>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left nutrient-balance"></td>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left"></td>
+            <td class="border-bottom border-left border-right"></td>
+          </tr>
+        </tbody>
+    </table>
+
+    <div class="clearfix"></div>
+					</div>
+
+				</div>
+
+			</main>
+			
+			<footer class="py-4 bg-light mt-auto">
+                <div class="container-fluid px-4">
+                    <div class="d-flex align-items-center justify-content-between small">
+                        <div class="text-muted">[[SimpleCopyright? &startYear=`2003`]]. All Rights Reserved <a href="[[~1]]"></a></div>
+                        <div>
+                            <a href="[[~39~]]">Privacy Policy</a>
+                            &middot;
+                            <a href="[[~39~]]">Terms &amp; Conditions</a>
+                        </div>
+                    </div>
+                </div>
+            </footer>
+            
+		</div>
+
+	</div>
+
+	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
+	<script>
+    	/*!
+            * Start Bootstrap - SB Admin v7.0.3 (https://startbootstrap.com/template/sb-admin)
+            * Copyright 2013-2021 Start Bootstrap
+            * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-sb-admin/blob/master/LICENSE)
+            */
+            // 
+        // Scripts
+        // 
+        
+        window.addEventListener('DOMContentLoaded', event => {
+        
+            // Toggle the side navigation
+            const sidebarToggle = document.body.querySelector('#sidebarToggle');
+            if (sidebarToggle) {
+                // Uncomment Below to persist sidebar toggle between refreshes
+                // if (localStorage.getItem('sb|sidebar-toggle') === 'true') {
+                //     document.body.classList.toggle('sb-sidenav-toggled');
+                // }
+                sidebarToggle.addEventListener('click', event => {
+                    event.preventDefault();
+                    document.body.classList.toggle('sb-sidenav-toggled');
+                    localStorage.setItem('sb|sidebar-toggle', document.body.classList.contains('sb-sidenav-toggled'));
+                });
+            }
+        
+        });
+
+	</script>
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js" crossorigin="anonymous"></script>
+	<script src="https://cdn.jsdelivr.net/npm/simple-datatables@latest" crossorigin="anonymous"></script>
+</body>
+</html>

+ 507 - 0
dashboard/crop-analysis/water-test-data/water-test-data.php

@@ -0,0 +1,507 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+	<title>[[*longtitle]] | [[++site_name]]</title>
+	<base href="[[!++site_url]]">
+	<meta charset="[[++modx_charset]]">
+	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+	<meta name="keywords" content="[[*introtext]]">
+	<meta name="description" content="[[*description]]">
+	<link rel="icon" href="client-assets/images/favicon.ico?v=2" type="image/x-icon"> [[!Profile]]
+	
+	<script type="text/javascript">
+    	window.dataLayer = window.dataLayer || [];
+    
+    	function gtag() {
+    		dataLayer.push(arguments);
+    	}
+    	gtag('js', new Date());
+    	gtag('set', {
+    		'user_id': '[[+modx.user.id]]'
+    	}); // Set the user ID using signed-in user_id.
+    	gtag('config', 'UA-133963301-1');
+	</script>
+	
+	<link href="https://cdn.jsdelivr.net/npm/simple-datatables@latest/dist/style.css" rel="stylesheet" />
+	<link href="client-assets/css/dashboard-2021.css" rel="stylesheet" />
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/js/all.min.js" crossorigin="anonymous"></script>
+	<link href="https://cdn.datatables.net/1.10.20/css/dataTables.bootstrap4.min.css" rel="stylesheet" crossorigin="anonymous" />
+	<script src="client-assets/js/skycons.js"></script>
+	<style>
+    	.btn-append {
+    		color: #495057;
+    		background-color: #e9ecef;
+    		border: 1px solid #ced4da;
+    	}
+    	.footer {
+    		position: absolute;
+    		bottom: 0;
+    		width: 100%;
+    		height: 60px;
+    		line-height: 60px;
+    	}
+	</style>
+</head>
+
+<body class="sb-nav-fixed" id="page-top"> 
+    [[!Personalize?
+        &yesChunk=`navHeaderLogged`
+        &noChunk=`navHeader`
+        &allowedGroups=`basicClients,bacicAdmin,companyClients,companyManagers`
+    ]]
+    
+	<div id="layoutSidenav">
+	    <div id="layoutSidenav_nav">
+    		<!-- Sidebar -->
+    		[[Wayfinder?
+    		    &startId=`2` 
+        		&displayStart=`0` 
+        		&startitemTpl=`startitemTpl` 
+        		&selfClass=`show` 
+        		&level=`2`
+        		&outerTpl=`outer`
+        		    &outerClass=`sb-sidenav accordion sb-sidenav-dark`
+        		&rowTpl=`row`
+        		    &rowClass=`nav-link`
+        		&parentRowTpl=`parentRow`
+        		    &parentClass=`nav-link collapsed`
+        		&innerTpl=`inner`
+        		    &innerClass=`collapse`
+        		&innerRowTpl=`secondInner`
+        		    &innerRowClass=`nav-link`
+    		]]
+        </div>
+		
+		<div id="layoutSidenav_content">
+			<main>
+
+				<div class="container-fluid px-4">
+				    <h1 class="mt-4">[[*pagetitle]]</h1>
+
+					<ol class="breadcrumb mb-4"> [[$dash-breadcrumbs]] </ol>
+					
+					<div class="row">
+					    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.js" integrity="sha256-gfQwA6PlkZsLqWu4bU4hXPrbTqzixm0B5MdvBLI+Oas=" crossorigin="anonymous"></script>
+
+<div class="grid-form1">
+<h3 id="forms-example" class="">[[*longtitle]]</h3>
+
+<span class="error">* required fields.</span>
+
+<form method="post" action="[[~34~]]" id="WatercsvForm"class="needs-validation" novalidate >
+
+    [[!Personalize?
+        &yesChunk=`analysisLogged_Clientdetails`
+        &noChunk=`analysis_Clientdetails`
+    ]]
+    
+    <hr>
+    
+    <div class="row">
+    
+    <div class="col ">
+        <small id="lab_no" class="form-text text-muted">Lab No</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="lab_no" id="lab_no" placeholder="Lab No"></input>
+        
+        </div>
+    </div>
+    
+    <div class="col ">
+        <small id="batch_no" class="form-text text-muted">Batch No</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="batch_no" id="batch_no" placeholder="Batch No"></input>
+            
+        </div>
+    </div>
+    <div class="col ">
+        <small id="date_sampled" class="form-text text-muted">Date Sampled</small>
+        <input data-provide="datepicker" class="form-control form-control-sm" name="date_sampled" id="datepicker" placeholder="Date Sampled" data-date-format="dd/mm/yyyy" data-date-end-date="0d" ></input>
+        <script>
+            $('#datepicker').datepicker({
+                uiLibrary: 'bootstrap4',
+                calendarWeeks: 'true',
+                todayHighlight: 'true'
+            });
+        </script>
+    </div>
+    
+    <!-- Hidden Fields for Database -->
+    <input type="hidden" class="form-control form-control-sm" name="m_user" id="m_user" placeholder="[[+modx.user.id]]" required>
+    <input type="hidden" class="form-control form-control-sm" name="client_id" id="client_id" placeholder="[[+modx.user.username]]" required>
+
+    <div class="col ">
+        <small id="lab_no" class="form-text text-muted">Sample ID<span class="error">*</span></small>
+        <input type="text" class="form-control form-control-sm" name="sample_id" id="sample_id" placeholder="Sample Id" required></input>
+    </div>
+    
+    <div class="col ">
+        <small id="lab_no" class="form-text text-muted">Site ID</small>
+        <input type="text" class="form-control form-control-sm" name="site_id" id="site_id" placeholder="Paddock Id"></input>
+    </div>
+
+</div>
+
+<hr>
+
+<label class="col"><b>Analysis Inputs</b></label>
+		
+<div class="row">
+	<div class=" col-md-2">
+	<small id="phSmall" class="form-text text-muted">pH</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="ph" id="ph" placeholder="pH" required></input>
+	    <div class="input-group-append">
+                <input class="btn btn-append" type="button" value="pH" ></input>
+            </div>
+        </div>
+    </div>
+    
+    <div class=" col-md-2">
+	<small id="phSmall" class="form-text text-muted">Conductivity</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="ph" id="ph" placeholder="pH" required></input>
+	    <div class="input-group-append">
+                <input class="btn btn-append" type="button" value="pH" ></input>
+            </div>
+        </div>
+    </div>
+</div>
+
+<div class="row">    
+	<div class=" col-md-2">
+	<small id="nSmall" class="form-text text-muted">Nitrogen</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="n" id="n" placeholder="N - Nitrogen" required></input>
+	    <div class="input-group-append">
+                <input class="btn btn-append" type="button" id="nitrogen" value="ppm" onClick="conversion(this, nitrogen, n, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+
+	<div class=" col-md-2">
+	<small id="p" class="form-text text-muted">Phosphorus</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="p" id="p" placeholder="P - Phosphorus" required></input>
+	    <div class="input-group-append">
+                <input class="btn btn-append" type="button" id="phosphorus" value="ppm" onClick="conversion(this, phosphorus, p, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+	<small id="k" class="form-text text-muted">Postassium</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="k" id="k" placeholder="K - Postassium" required></input>
+	    <div class="input-group-append">
+                <input class="btn btn-append" type="button" id="postassium" value="ppm" onClick="conversion(this, postassium, k, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+	<small id="s" class="form-text text-muted">Sulphur</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="s" id="s" placeholder="S - Sulphur"></input>
+	    <div class="input-group-append">
+                <input class="btn btn-append" type="button" id="sulphur" value="ppm" onClick="conversion(this, sulphur, s, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+	<small id="mg" class="form-text text-muted">Magnesium</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="mg" id="mg" placeholder="Mg - Magnesium"></input>
+	    <div class="input-group-append">
+                <input class="btn btn-append" type="button" id="magnesium" value="ppm" onClick="conversion(this, magnesium, mg, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+    	<small id="ca" class="form-text text-muted">Calcium</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="ca" id="ca" placeholder="Ca - Calcium"></input>
+	    <div class="input-group-append">
+                <input class="btn btn-append" type="button" id="calcium" value="ppm" onClick="conversion(this, calcium, ca, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+</div>
+
+
+	
+<div class="row">
+	<div class=" col-md-2">
+		<small id="na" class="form-text text-muted">Soduim</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="na" id="na" placeholder="Na - Soduim"></input>
+    	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="soduim" value="ppm" onClick="conversion(this, soduim, na, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+		<small id="fe" class="form-text text-muted">Iron</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="fe" id="fe" placeholder="Fe - Iron"></input>
+    	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="iron" value="ppm" onClick="conversion(this, iron, fe, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+		<small id="mn" class="form-text text-muted">Manganese</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="mn" id="mn" placeholder="Mn - Manganese"></input>
+    	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="manganese" value="ppm" onClick="conversion(this, manganese, mn, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+		<small id="zn" class="form-text text-muted">Zinc</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="zn" id="zn" placeholder="Zn - Zinc"></input>
+    	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="zinc" value="ppm" onClick="conversion(this, zinc, zn, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+		<small id="cu" class="form-text text-muted">Copper</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="cu" id="cu" placeholder="Cu - Copper"></input>
+    	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="copper" value="ppm" onClick="conversion(this, copper, cu, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+		<small id="b" class="form-text text-muted">Boron</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="b" id="b" placeholder="B - Boron"></input>
+    	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="boron" value="ppm" onClick="conversion(this, boron, b, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+</div>
+
+<div class="row">
+	<div class=" col-md-2">
+		<small id="m" class="form-text text-muted">Molybdenum</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="m" id="m" placeholder="M - Molybdenum"></input>
+     	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="molybdenum" value="ppm" onClick="conversion(this, molybdenum, m, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+		<small id="co" class="form-text text-muted">Cobalt</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="co" id="co" placeholder="Co - Cobalt"></input>
+	 	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="cobalt" value="ppm" onClick="conversion(this, cobalt, co, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+		<small id="se" class="form-text text-muted">Selenium</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="se" id="se" placeholder="Se - Selenium"></input>
+	 	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="selenium" value="ppm" onClick="conversion(this, selenium, se, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+	
+	<div class=" col-md-2">
+		<small id="ch" class="form-text text-muted">Chloride</small>
+        <div class="input-group input-group-sm mb-3">
+            <input type="text" class="form-control form-control-sm" name="ch" id="ch" placeholder="Ch - Chloride" required></input>
+	 	<div class="input-group-append">
+                <input class="btn btn-append" type="button" id="chloride" value="ppm" onClick="conversion(this, chloride, cg, 10000)" ></input>
+            </div>
+        </div>
+    </div>
+    
+</div>
+
+
+<script type="text/javascript">
+    function conversion(value, input, element, conversion) {
+        var Nvalue = document.getElementById(element.id).value;
+        var el = document.getElementById(input.id);
+        if ( el.value === "%" ) {
+            el.value = "ppm";
+            document.getElementById(element.id).value = Nvalue*conversion;
+        } else {
+            el.value = "%";
+            document.getElementById(element.id).value = Nvalue/conversion;
+        }
+    }
+</script>
+		
+ <button id="WatercsvForm" type="submit" class="btn btn-success">Submit</button>
+</form>
+
+    [[$waterAnalysisUpload]]
+
+<hr>
+
+<div class="card">
+    <div class="card-body">
+        <h5 class="card-title">Excel/CSV Upload</h5>
+        <p class="card-text">Download a csv of this form for easy filling or upload a filled form to pre-populate.</p>
+        <div class="input-group mt-3">
+            <div class="custom-file">
+                <input type="file" class="custom-file-input" id="upload">
+                <label class="custom-file-label border-success" for="upload">Choose file</label>
+            </div>
+            <div class="input-group-append">
+                <button class="btn btn-success" type="button" id="download">Download</button>
+            </div>
+        </div>
+    </div>
+</div>
+
+</div>
+
+
+
+<!-- ************************ Download Form as CSV ************************ -->
+<script>
+    document.getElementById("upload").addEventListener("change", upload, false);
+    document.getElementById("download").addEventListener("click", download, false);
+    
+    function upload(e) {
+        var data = null;
+        var file = e.target.files[0];
+        var reader = new FileReader();
+        reader.readAsText(file);
+        reader.onload = function (event) {
+            var csvData = event.target.result;
+            var parsedCSV = d3.csv.parseRows(csvData);
+            parsedCSV.forEach(function (d, i) {
+                if (i == 0) return true; // skip the header
+                document.getElementById(d[0]).value = d[1];
+            });
+        }
+    }
+    
+    function download(e) {
+        data = [ ["id","value"]];
+        var f = d3.selectAll("#WatercsvForm input, select")[0];
+        f.forEach(function(d,i){
+          	data.push([d.id, d.value]);
+        });
+        console.log(data);
+        var csvContent = "data:text/csv;charset=utf-8,";
+        data.forEach(function (d, i) {
+            dataString = d.join(",");
+            csvContent += i < data.length ? dataString + "\n" : dataString;
+        });
+        var url = window.location.pathname;
+        var filename = url.substring(url.lastIndexOf('/')+1);
+        var fname = filename.split(".")[0];
+        var today = new Date();
+        var date = today.getDate()+''+(today.getMonth()+1)+''+today.getFullYear();
+        var csvname = date+''+"-water.csv";
+    
+        var encodedUri = encodeURI(csvContent);
+        var link = document.createElement("a");
+        link.setAttribute("href", encodedUri);
+        link.setAttribute("download", csvname);
+        link.click();
+    }
+</script>
+<script type="text/javascript">
+    // JavaScript for disabling form submission if there are invalid fields
+    (function() {
+      'use strict';
+      window.addEventListener('load', function() {
+        // Fetch all the forms we want to apply custom Bootstrap validation styles to
+        var forms = document.getElementsByClassName('needs-validation');
+        // Loop over them and prevent submission
+        var validation = Array.prototype.filter.call(forms, function(form) {
+          form.addEventListener('submit', function(event) {
+            if (form.checkValidity() === false) {
+              event.preventDefault();
+              event.stopPropagation();
+            }
+            form.classList.add('was-validated');
+          }, false);
+        });
+      }, false);
+    })();
+    
+</script>
+					</div>
+
+				</div>
+
+			</main>
+			
+			<footer class="py-4 bg-light mt-auto">
+                <div class="container-fluid px-4">
+                    <div class="d-flex align-items-center justify-content-between small">
+                        <div class="text-muted">[[SimpleCopyright? &startYear=`2003`]]. All Rights Reserved <a href="[[~1]]"></a></div>
+                        <div>
+                            <a href="[[~39~]]">Privacy Policy</a>
+                            &middot;
+                            <a href="[[~39~]]">Terms &amp; Conditions</a>
+                        </div>
+                    </div>
+                </div>
+            </footer>
+            
+		</div>
+
+	</div>
+
+	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
+	<script>
+    	/*!
+            * Start Bootstrap - SB Admin v7.0.3 (https://startbootstrap.com/template/sb-admin)
+            * Copyright 2013-2021 Start Bootstrap
+            * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-sb-admin/blob/master/LICENSE)
+            */
+            // 
+        // Scripts
+        // 
+        
+        window.addEventListener('DOMContentLoaded', event => {
+        
+            // Toggle the side navigation
+            const sidebarToggle = document.body.querySelector('#sidebarToggle');
+            if (sidebarToggle) {
+                // Uncomment Below to persist sidebar toggle between refreshes
+                // if (localStorage.getItem('sb|sidebar-toggle') === 'true') {
+                //     document.body.classList.toggle('sb-sidenav-toggled');
+                // }
+                sidebarToggle.addEventListener('click', event => {
+                    event.preventDefault();
+                    document.body.classList.toggle('sb-sidenav-toggled');
+                    localStorage.setItem('sb|sidebar-toggle', document.body.classList.contains('sb-sidenav-toggled'));
+                });
+            }
+        
+        });
+
+	</script>
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js" crossorigin="anonymous"></script>
+	<script src="https://cdn.jsdelivr.net/npm/simple-datatables@latest" crossorigin="anonymous"></script>
+</body>
+</html>

+ 207 - 0
dashboard/crop-analysis/water-test-data/water-uploadsubmit.php

@@ -0,0 +1,207 @@
+<?php
+require('client-assets/php/spreadsheet/php-excel-reader/excel_reader2.php');
+require('client-assets/php/spreadsheet/SpreadsheetReader.php');
+
+    $dbHost = "localhost";
+	$dbDatabase = "cropmonitor";
+	$dbPasswrod = "brvnCcaEYxlPCS3";
+	$dbUser = "cropmonitor";
+	$mysqli = new mysqli($dbHost, $dbUser, $dbPasswrod, $dbDatabase);
+	//$con = mysqli_connect("localhost", "cropmonitor", "brvnCcaEYxlPCS3", "cropmonitor");
+
+
+if(isset($_POST['Submit'])){
+
+  $mimes = ['application/vnd.ms-excel','text/xls','text/xlsx','text/csv','application/vnd.oasis.opendocument.spreadsheet'];
+  if(in_array($_FILES["file"]["type"],$mimes)){
+
+    $uploadFilePath = 'client-assets/uploads/'.basename($_FILES['file']['name']);  //need to add individual folders for clients.
+    move_uploaded_file($_FILES['file']['tmp_name'], $uploadFilePath);
+
+    $Reader = new SpreadsheetReader($uploadFilePath);
+
+    $totalSheet = count($Reader->sheets());
+
+    echo "You have total ".$totalSheet." sheets".
+
+    $html="<table border='1'>";
+
+    /* For Loop for all sheets */
+    for($i=0;$i<$totalSheet;$i++){
+
+      $Reader->ChangeSheet($i);
+
+      foreach ($Reader as $Row)
+      {
+        $html.="<tr>";
+        $title = isset($Row[0]) ? $Row[0] : '';
+        $description = isset($Row[1]) ? $Row[1] : '';
+        $html.="<td>".id."</td>";
+        $html.="<td>".analysis_type."</td>";
+        $html.="<td>".lab_no."</td>";
+        $html.="<td>".batch_no."</td>";
+        $html.="<td>".sample_id."</td>";
+        $html.="<td>".site_id."</td>";
+        $html.="<td>".crop."</td>";
+        $html.="<td>".date_sampled."</td>";
+        $html.="<td>".lab_no."</td>";
+        $html.="<td>".batch_no."</td>";
+        $html.="<td>".sample_id."</td>";
+        $html.="<td>".site_id."</td>";
+        $html.="<td>".tec."</td>";
+        $html.="<td>".cec."</td>";
+        $html.="<td>".texture."</td>";
+        $html.="<td>".gravel."</td>";
+        $html.="<td>".colour."</td>";
+        $html.="<td>".NO3_N."</td>";
+        $html.="<td>".NH3_N."</td>";
+        $html.="<td>".p_mehlick."</td>";
+        $html.="<td>".p_bray2."</td>";
+        $html.="<td>".p_morgan."</td>";
+        $html.="<td>".k_morgan."</td>";
+        $html.="<td>".ca_morgan."</td>";
+        $html.="<td>".mg_morgan."</td>";
+        $html.="<td>".na_morgan."</td>";
+        $html.="<td>".ch_h2o."</td>";
+        $html.="<td>".ocarbon."</td>";
+        $html.="<td>".omatter."</td>";
+        $html.="<td>".fe."</td>";
+        $html.="<td>".ec."</td>";
+        $html.="<td>".ph_cacl2."</td>";
+        $html.="<td>".ph_h2o."</td>";
+        $html.="<td>".paramag."</td>";
+        $html.="<td>".s_morgan."</td>";
+        $html.="<td>".b_cacl2."</td>";
+        $html.="<td>".mn_dtpa."</td>";
+        $html.="<td>".zn_dtpa."</td>";
+        $html.="<td>".fe_dtpa."</td>";
+        $html.="<td>".cu_dtpa."</td>";
+        $html.="<td>".al."</td>";
+        $html.="<td>".sl_cacl2."</td>";
+        $html.="<td>".m_dtpa."</td>";
+        $html.="<td>".co_dtpa."</td>";
+        $html.="<td>".se."</td>";
+        $html.="<td>".ca_mehlick3."</td>";
+        $html.="<td>".mg_mehlick3."</td>";
+        $html.="<td>".k_mehlick3."</td>";
+        $html.="<td>".na_mehlick3."</td>";
+        $html.="<td>".al_mehlick3."</td>";
+        $html.="</tr>";
+
+        $query = "insert into soil_records(
+            analysis_type,
+            lab_no,
+            batch_no,
+            sample_id,
+            site_id,
+            crop,
+            date_sampled,
+            lab_no,
+            batch_no,
+            sample_id,
+            site_id,
+            tec,
+            cec,
+            texture,
+            gravel,
+            colour,
+            NO3_N,
+            NH3_N,
+            p_mehlick,
+            p_bray2,
+            p_morgan,
+            k_morgan,
+            ca_morgan,
+            mg_morgan,
+            na_morgan,
+            ch_h2o,
+            ocarbon,
+            omatter,
+            fe,
+            ec,
+            ph_cacl2,
+            ph_h2o,
+            paramag,
+            s_morgan,
+            b_cacl2,
+            mn_dtpa,
+            zn_dtpa,
+            fe_dtpa,
+            cu_dtpa,
+            al,
+            sl_cacl2,
+            m_dtpa,
+            co_dtpa,
+            se,
+            ca_mehlick3,
+            mg_mehlick3,
+            k_mehlick3,
+            na_mehlick3,
+            al_mehlick3
+        ) values(
+            '" . $analysis_type . "',
+            '" . $lab_no . "',
+            '" . $batch_no . "',
+            '" . $sample_id . "',
+            '" . $site_id . "',
+            '" . $crop . "',
+            '" . $date_sampled . "',
+            '" . $lab_no . "',
+            '" . $batch_no . "',
+            '" . $sample_id . "',
+            '" . $site_id . "',
+            '" . $tec . "',
+            '" . $cec . "',
+            '" . $texture . "',
+            '" . $gravel . "',
+            '" . $colour . "',
+            '" . $NO3_N . "',
+            '" . $NH3_N . "',
+            '" . $p_mehlick . "',
+            '" . $p_bray2 . "',
+            '" . $p_morgan . "',
+            '" . $k_morgan . "',
+            '" . $ca_morgan . "',
+            '" . $mg_morgan . "',
+            '" . $na_morgan . "',
+            '" . $ch_h2o . "',
+            '" . $ocarbon . "',
+            '" . $omatter . "',
+            '" . $fe . "',
+            '" . $ec . "',
+            '" . $ph_cacl2 . "',
+            '" . $ph_h2o . "',
+            '" . $paramag . "',
+            '" . $s_morgan . "',
+            '" . $b_cacl2 . "',
+            '" . $mn_dtpa . "',
+            '" . $zn_dtpa . "',
+            '" . $fe_dtpa . "',
+            '" . $cu_dtpa . "',
+            '" . $al . "',
+            '" . $sl_cacl2 . "',
+            '" . $m_dtpa . "',
+            '" . $co_dtpa . "',
+            '" . $se . "',
+            '" . $ca_mehlick3 . "',
+            '" . $mg_mehlick3 . "',
+            '" . $k_mehlick3 . "',
+            '" . $na_mehlick3 . "',
+            '" . $al_mehlick3 . "'
+        )";
+
+        $mysqli->query($query);
+       }
+
+    }
+
+    $html.="</table>";
+    echo $html;
+    echo "<br />Data Inserted in dababase";
+
+  }else { 
+    die("<br/>Sorry, Incorrect file."); 
+  }
+
+}
+?>

+ 811 - 0
dashboard/crop-cards/index.php

@@ -0,0 +1,811 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+	<title>[[*longtitle]] | [[++site_name]]</title>
+	<base href="[[!++site_url]]">
+	<meta charset="[[++modx_charset]]">
+	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+	<meta name="keywords" content="[[*introtext]]">
+	<meta name="description" content="[[*description]]">
+	<link rel="icon" href="client-assets/images/favicon.ico?v=2" type="image/x-icon"> [[!Profile]]
+	
+	<script type="text/javascript">
+    	window.dataLayer = window.dataLayer || [];
+    
+    	function gtag() {
+    		dataLayer.push(arguments);
+    	}
+    	gtag('js', new Date());
+    	gtag('set', {
+    		'user_id': '[[+modx.user.id]]'
+    	}); // Set the user ID using signed-in user_id.
+    	gtag('config', 'UA-133963301-1');
+	</script>
+	
+	<link href="https://cdn.jsdelivr.net/npm/simple-datatables@latest/dist/style.css" rel="stylesheet" />
+	<link href="client-assets/css/dashboard-2021.css" rel="stylesheet" />
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/js/all.min.js" crossorigin="anonymous"></script>
+	<link href="https://cdn.datatables.net/1.10.20/css/dataTables.bootstrap4.min.css" rel="stylesheet" crossorigin="anonymous" />
+	<script src="client-assets/js/skycons.js"></script>
+	<style>
+    	.btn-append {
+    		color: #495057;
+    		background-color: #e9ecef;
+    		border: 1px solid #ced4da;
+    	}
+    	.footer {
+    		position: absolute;
+    		bottom: 0;
+    		width: 100%;
+    		height: 60px;
+    		line-height: 60px;
+    	}
+	</style>
+</head>
+
+<body class="sb-nav-fixed" id="page-top"> 
+    [[!Personalize?
+        &yesChunk=`navHeaderLogged`
+        &noChunk=`navHeader`
+        &allowedGroups=`basicClients,bacicAdmin,companyClients,companyManagers`
+    ]]
+    
+	<div id="layoutSidenav">
+	    <div id="layoutSidenav_nav">
+    		<!-- Sidebar -->
+    		[[Wayfinder?
+    		    &startId=`2` 
+        		&displayStart=`0` 
+        		&startitemTpl=`startitemTpl` 
+        		&selfClass=`show` 
+        		&level=`2`
+        		&outerTpl=`outer`
+        		    &outerClass=`sb-sidenav accordion sb-sidenav-dark`
+        		&rowTpl=`row`
+        		    &rowClass=`nav-link`
+        		&parentRowTpl=`parentRow`
+        		    &parentClass=`nav-link collapsed`
+        		&innerTpl=`inner`
+        		    &innerClass=`collapse`
+        		&innerRowTpl=`secondInner`
+        		    &innerRowClass=`nav-link`
+    		]]
+        </div>
+		
+		<div id="layoutSidenav_content">
+			<main>
+
+				<div class="container-fluid px-4">
+				    <h1 class="mt-4">[[*pagetitle]]</h1>
+
+					<ol class="breadcrumb mb-4"> [[$dash-breadcrumbs]] </ol>
+					
+					<div class="row">
+					    <div class="container-fluid">
+    <div class="row">
+        <div class="col">
+            <h2>[[*pagetitle]]</h2>
+        </div>
+    </div>
+	
+	<!--grid-->
+	<div class="row">
+		<div class="col-12 col-md-3">
+			
+			<div class="row">
+			    <div class="col">
+        			<form action="#" method="GET">
+        				<div class="input-group mb-3">
+        					<input type="text" class="form-control" aria-label="Recipient's username" aria-describedby="basic-addon2" placeholder="Search...">
+        					<div class="input-group-append">
+        						<span class="input-group-text" id="basic-addon2"><i class="fa fa-search"></i></span>
+        					</div>
+        				</div>
+        				<!-- Input Group -->
+        			</form>
+			    </div>
+			</div>
+			
+			<div class="row ">
+			    <div class="col">
+        			<div class="alert alert-danger" role="alert">
+        				<h3>[[*longtitle]]</h3>
+        			</div>
+        		</div>
+    		</div>
+
+            <div class="row ">
+			    <div class="col">
+        			<div class="list-group">
+        				<a href="#" class="list-group-item list-group-item-action"> Folders
+        				</a>
+        				<a href="#" class="list-group-item list-group-item-action list-group-item-light text-warning">
+        			    	<i class="fa fa-archive text-warning" aria-hidden="true"></i> Archived
+        				    <span class="badge badge-warning badge-pill float-right">[[!analysisCount? &analysis=`block_info` &cid=`[[+id]]` &status=`2` ]]</span>
+        				</a>
+        				<a href="#" class="list-group-item list-group-item-action list-group-item-light text-danger">
+        				    <i class="fa fa-trash text-danger" aria-hidden="true"></i> Deleted
+        				    <span class="badge badge-danger badge-pill float-right">[[!analysisCount? &analysis=`block_info` &cid=`[[+id]]` &status=`3` ]]</span>
+        				</a>
+        			</div>
+        		</div>
+        	</div>
+			
+		</div>
+
+    	<hr>
+    	
+    	<!-- tab content -->
+    	<div class="col-12 col-md-9 ">
+    			<!-- tab content -->
+    
+            
+    	    
+    	    <br>
+    	
+        	<div class="row">
+        		<div class="col">
+        			<h3>[[*longtitle]]</h3>
+        		</div>
+        	</div>
+        	
+        	<div class="row"> 
+        	<div class="col"> 
+        	<button type="button" class="btn btn-success" data-toggle="modal" data-target="#createPaddock">Create New Paddock</button> 
+        	<!-- Modal -->
+<div class="modal fade" id="createPaddock" tabindex="-1" role="dialog" aria-labelledby="createPaddock" aria-hidden="true">
+  <div class="modal-dialog modal-lg modal-dialog-centered" role="document">
+    <div class="modal-content">
+      <div class="modal-header">
+        <h5 class="modal-title" id="exampleModalLabel">Create Paddock Record</h5>
+        <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+          <span aria-hidden="true">&times;</span>
+        </button>
+      </div>
+      <div class="modal-body">
+          
+          <?php
+error_reporting(E_ALL);
+ini_set('display_errors', 1);
+
+if(isset($_POST['submit'])) {
+    
+    $sql = null;
+    //$con = mysqli_connect("localhost", "root", "R3M0T31", "cropmonitor");
+    $con = mysqli_connect("localhost", "cropmonitor", "brvnCcaEYxlPCS3", "cropmonitor");
+    
+    //set todays date
+    $date_added = date("Y-m-d H:i:s");
+    
+    //Get figures
+    $modx_user_id = (isset($_POST["m_user"])) ? $_POST["m_user"] : "";
+    
+    $client_name = (isset($_POST["name"])) ? $_POST["name"] : "";
+    $site_address = (isset($_POST["site_address"])) ? $_POST["site_address"] : "";
+    
+    $site_id = (isset($_POST["site_id"])) ? $_POST["site_id"] : "";
+    
+    $soil_type = (isset($_POST["analysis_type"])) ? $_POST["analysis_type"] : "";  //need to fix form to say soil_type not analysis_type
+    
+    
+    
+    /* ********* END ********* */
+    
+    // Check connection
+    if (mysqli_connect_errno()) {
+        echo "Failed to connect to MySQL: " . mysqli_connect_error();
+    }
+    		
+    $sql = mysqli_query($con, "INSERT into `block_info`
+                (
+                    modx_user_id,
+                    date_added,
+                    area,
+                    block_id
+                ) VALUES (
+                    '" . $modx_user_id . "',
+                    '" . $date_added . "',
+                    '" . $area . "',
+                    '" . $block_id . "'
+                )" );
+    
+    $insert_id = mysqli_insert_id($con);
+    
+                
+    if ($sql === TRUE)
+    	{
+    	//echo "success"; //CHECKING
+    	// forward to results page if successfully inserts to database  [[~32]]
+    	echo "";
+        } else {
+        die(mysqli_error($con)); // TODO: better error handling
+        //echo "User Profile incorrect";
+    }
+}
+?>
+          
+          <form method="post" action="[~[*id*]~]" id="createPaddock" novalidate>
+              
+              <input type="text" class="form-control" id="modx_user" value="[[+user]]" hidden>
+              <input type="text" class="form-control" id="mid" value="[[+id]]" hidden>
+              
+              <h6>Block Identification</h6>
+              <div class="form-row">
+                  <div class="col">
+                    <label for="exampleInputEmail1">Block ID</label>
+                    <input type="text" class="form-control form-control-sm" id="id" aria-describedby="idHelp" placeholder="Block Id" required>
+                    <small id="emailHelp" class="form-text text-muted"></small>
+                    <div class="valid-feedback">Looks good!</div>
+                  </div>
+                  <div class="col">
+                    <label for="exampleInputEmail1">Block Name</label>
+                    <input type="text" class="form-control form-control-sm" id="name" aria-describedby="idHelp" placeholder="Block Name" required>
+                    <small id="emailHelp" class="form-text text-muted"></small>
+                  </div>
+              </div>
+              
+              <hr>
+              <h6>Location / Sizing</h6>
+              <div class="form-group">
+                <label for="exampleInputPassword1">Location</label>
+                <input type="text" class="form-control form-control-sm" id="location" placeholder="Block Address">
+              </div>
+              
+              <div class="form-row">
+                  <div class="col">
+                    <label for="exampleInputEmail1">Area</label>
+                    <input type="number" class="form-control form-control-sm" id="area_ha" aria-describedby="areaHelp" placeholder="Block Size" oninput="areaConverter(this.id,this.value)" onchange="areaConverter(this.value)">
+                    <small id="areaHelp" class="form-text text-muted">in hectare's</small>
+                  </div>
+                  <div class="col">
+                    <label for="exampleInputEmail1">Area</label>
+                    <input type="number" class="form-control form-control-sm" id="area_ac" aria-describedby="areaHelp" placeholder="Block Size" oninput="areaConverter(this.id,this.value)" onchange="areaConverter(this.value)">
+                    <small id="areaHelp" class="form-text text-muted">in acre's</small>
+                  </div>
+                  <div class="col">
+                    <label for="exampleInputEmail1">Block Name</label>
+                    <input type="text" class="form-control form-control-sm" id="name" aria-describedby="idHelp" placeholder="Block Name">
+                    <small id="emailHelp" class="form-text text-muted"></small>
+                  </div>
+              </div>
+              
+              <script>
+            	function areaConverter(source,valNum) {
+            		valNum = parseFloat(valNum);
+            		var area_ha = document.getElementById("area_ha");
+            		var area_ac = document.getElementById("area_ac");
+            		
+            		if (source=="area_ha") {
+            			area_ac.value=(valNum/0.404686).toFixed(2);
+            		}
+            		if (source=="area_ac") {
+            			area_ha.value=(valNum/2.4710559990832).toFixed(2);
+            		}
+            	}
+              </script>
+              
+              <hr>
+              <h6>Soil Clasification</h6>
+              <div class="form-row">
+                  <div class="col">
+                    <label for="exampleInputEmail1">Area</label>
+                    <select class="form-control form-control-sm" name="analysis_type" id="analysis_type" required>
+                        <option>Select the type of soil...</option>
+                        <option id="sandy">sandy</option>
+                        <option id="light">light</option>
+                        <option id="medium">medium</option>
+                        <option id="heavy">heavy</option>
+                    </select>
+                  </div>
+                  <div class="col">
+                    <label for="exampleInputEmail1">Block Name</label>
+                    <input type="text" class="form-control form-control-sm" id="name" aria-describedby="idHelp" placeholder="Block Name">
+                    <small id="emailHelp" class="form-text text-muted"></small>
+                  </div>
+              </div>
+
+            
+      </div>
+      <div class="modal-footer">
+        <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
+        <button form="createPaddock" type="submit" class="btn btn-success">Save changes</button>
+        </form>
+      </div>
+    </div>
+  </div>
+</div>
+
+        	</div> 
+        	</div> 
+        	<br> 
+
+
+        	<div class="row">
+        		<div class="col">
+            		<div class="d-none d-md-block "> <!-- d-lg-none -->
+            		    <div class='form-row'>
+                            <div class='col-md-1'><input type='text' readonly class='text-center form-control-plaintext font-weight-bold' placeholder='ID' ></div>
+                            <div class='col-md-1'><input type='text' readonly class='text-center form-control-plaintext font-weight-bold' placeholder='Edit' ></div>
+                            <div class='col'><input type='text' readonly class='text-center form-control-plaintext font-weight-bold' placeholder='Name' ></div>
+                            <div class='col-md-1'><input type='text' readonly class='text-center form-control-plaintext font-weight-bold' placeholder='Size' ></div>
+                            <div class='col-md-2'><input type='text' readonly class='text-center form-control-plaintext font-weight-bold' placeholder='Location' ></div>
+                            <div class='col-md-2'><input type='text' readonly class='text-center form-control-plaintext font-weight-bold' placeholder='Current Crop' ></div>
+                            <div class='col-md-1'><input type='text' readonly class='text-center form-control-plaintext font-weight-bold' placeholder='Status' ></div>
+                            <div class='col-md-1'><input type='text' readonly class='text-center form-control-plaintext font-weight-bold' placeholder='Actions' ></div>
+                        </div>
+                    </div>
+                
+                /*[[!blockIdentification? &cid=`[[+id]]` ]]*/
+				<?php
+if ($cid) {
+     $client_id = $cid; //  client number
+} else {
+    $client_id = '2'; // client number
+}
+
+$client_id = '2'; // client number
+
+$analysisType = $analysis;
+$icon = $icon;
+
+/*
+Status Table
+0 = Blank
+1 = Read
+2 = Archived
+3 = Deleted
+*/
+
+//Database connection
+//$con = mysqli_connect("localhost", "root", "R3M0T31", "cropmonitor");
+$con = mysqli_connect("localhost", "cropmonitor", "brvnCcaEYxlPCS3", "cropmonitor");
+
+// Check connection
+if (mysqli_connect_errno()) {
+    echo "Failed to connect to MySQL: " . mysqli_connect_error();
+}
+
+// Get results from database 
+$result = mysqli_query($con, "SELECT * FROM `block_info` WHERE `modx_user_id` = ". $client_id ." AND `status` <= 1 "); //
+                                 //
+//plant_records.crop_type, plant_specifications.plant_type, plant_specifications.N_Min, plant_specifications.N_Max, plant_records.N, plant_records.id
+// mysqli_query returns false if something went wrong with the query
+
+if ($result === FALSE) {
+    die(mysqli_error($con)); // TODO: better error handling
+    echo "User Profile incorrect";
+    
+} else {
+    $i = 1;
+    while ($row = mysqli_fetch_array($result)) {
+    
+        $rowid = $row['id'];
+        $name = $row['name'];
+        $block = $row['block_id'];
+        $location = $row['location'];
+        $area = $row['area'];
+            $area_ha = number_format($area,1);
+            $area_ac = number_format(($area * 2.47105),1);
+            $area_value = $area_ha . "ha - " . $area_ac . "acres";
+        $gps = $row['gps'];
+        $status = $row['status'];
+        
+        $currentCrop = '';
+        
+        /* Status Table */
+        if ($row['status'] == 0 ) { // 0 = Blank
+            $colour = 'table-secondary';
+        } else if ($row['status'] == 1 ) { //1 = Read
+            $colour = '';
+        } else if ($row['status'] == 2 ) { //2 = Archived
+            $colour = '';
+        } else if ($row['status'] == 3 ) { //3 = Deleted
+            $colour = '';
+        } else {
+            $colour = '';
+        }
+        
+        //$today = date('dS l M y');
+        //$filename = $row['rand'] . " - Soil-Analysis - " . $today;
+        
+        echo "<div class='row mb-2'>";
+        echo "<div class='col border border-success rounded p-1'>";
+        echo "<div class='form-row m-1'>";
+            echo "<div class='text-left font-weight-bold' ><p>$i</p></div>"; //<label for=''>ID</label>   d-none d-md-block d-lg-none
+            echo "<div class='col-6 col-sm-11 col-md-2'>";
+                echo "<div class='row'>";
+                    echo "<div class='col-6 col-md-6'><a class='text-left font-weight-bold btn btn-primary btn-sm btn-block' href='[[~93]]?rid=$rowid&id=$block&block=$name'><i class='fas fa-globe-asia fa-1x text-white' aria-hidden='true'></i></a></div>";
+                    echo "<div class='col-6 col-md-6'><button type='submit' class='text-left font-weight-bold btn btn-success btn-sm btn-block ' data-toggle='modal' data-target='#editPaddock$rowid'><i class='far fa-edit'></i>  " . $block . "</button></div>";
+                echo "</div>"; //<label for=''>Block</label>
+            echo "</div>";
+            echo "<div class='col'><label class='form-label form-label-sm m-0 d-block d-sm-none' for=''>Name</label><input type='text' class='form-control form-control-sm' value='$name'></div>";    //<label for=''>Name</label>
+            echo "<div class='col-md-1'><label class='form-label form-label-sm m-0 d-block d-sm-none' for=''>Size</label><input type='text' class='form-control form-control-sm text-center' value='$area_value'></div>";    //<label for=''>Size</label>
+            echo "<div class='col-md-2'><label class='form-label form-label-sm m-0 d-block d-sm-none' for=''>Location</label><input type='text' class='form-control form-control-sm' value='$location'></div>";    //<label for=''>Location</label>
+            echo "<div class='col-md-2'><label class='form-label form-label-sm m-0 d-block d-sm-none' for=''>Current Crop</label><input type='text' class='form-control form-control-sm' value='$currentCrop'></div>";    //<label for=''>Location</label>
+            echo "<div class='col-md-1'><label class='form-label form-label-sm m-0 d-block d-sm-none' for=''>Location</label><input type='text' readonly class='form-control form-control-plaintext form-control-sm' value='$status'></div>";    //<label for=''>Location</label>
+            echo "<div class='col-md-1'><label class='form-label form-label-sm m-0 d-block d-sm-none' for=''>Actions</label>";
+                echo "<a href='#' target='_blank' data-toggle='tooltip' data-placement='top' title='Delete Block'><i class='fa fa-trash text-danger' aria-hidden='true'></i>  ";
+                echo "<a href='#' target='_blank' data-toggle='tooltip' data-placement='top' title='Archive Block'><i class='fa fa-archive text-warning' aria-hidden='true'></i>  ";
+                echo "<a href='#' target='_blank' data-toggle='tooltip' data-placement='top' title='Reply to Client'><i class='text-success fa fa-reply' aria-hidden='true'></i>  ";
+                echo "<a href='#' target='_blank' data-toggle='tooltip' data-placement='top' title='Share Report'><i class='text-success fa fa-share' aria-hidden='true'></i></a>  ";
+                echo "<a href='#' target='_blank' data-toggle='tooltip' data-placement='top' title='Download Report'><i class='text-dark fas fa-cloud-download-alt'></i></a>";
+            echo "</div>";
+        echo "</div>";
+        echo "</div>";
+        echo "</div>";
+    
+    ?>
+   
+    <!-- ********************************************************* Modal ********************************************************* -->
+    <div class="modal fade" id="editPaddock<?php echo $rowid; ?>" tabindex="-1" role="dialog" aria-labelledby="editPaddock<?php echo $rowid; ?>" aria-hidden="true">
+      <div class="modal-dialog modal-lg modal-dialog-centered" role="document">
+        <div class="modal-content">
+          <div class="modal-header">
+            <h5 class="modal-title" id="exampleModalLabel">Edit Paddock Record</h5>
+            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+              <span aria-hidden="true">&times;</span>
+            </button>
+          </div>
+          <div class="modal-body">
+              
+              [[!createBlockSubmit]]
+              
+              <form method="post" action="[~[*id*]~]" id="editPaddock<?php echo $rowid; ?>" novalidate>
+                  
+                  <input type="text" class="form-control" id="modx_user" value="<?php echo $rowid; ?>" hidden>
+                  <input type="text" class="form-control" id="mid" value="[[+id]]" hidden>
+                  
+                  <div class="form-row">
+                      <div class="col">
+                        <label for="exampleInputEmail1">Block ID</label>
+                        <input type="text" class="form-control form-control-sm" id="block_id" aria-describedby="block_idHelp" value="<?php echo $block; ?>" required>
+                        <small id="block_idHelp" class="form-text text-muted"></small>
+                        <div class="valid-feedback">Looks good!</div>
+                      </div>
+                      <div class="col">
+                        <label for="exampleInputEmail1">Block Name</label>
+                        <input type="text" class="form-control form-control-sm" id="name" aria-describedby="nameHelp" value="<?php echo $name; ?>" required>
+                        <small id="nameHelp" class="form-text text-muted"></small>
+                      </div>
+                  </div>
+                  
+                  <hr>
+                  <h6>Location / Sizing</h6>
+                  <div class="form-group">
+                    <label for="exampleInputPassword1">Location</label>
+                    <input type="text" class="form-control form-control-sm" id="location" value="<?php echo $location; ?>" >
+                  </div>
+                  
+                  <div class="form-row">
+                      <div class="col">
+                        <label for="exampleInputEmail1">Area</label>
+                        <input type="text" class="form-control form-control-sm" id="area_ha" aria-describedby="areahaHelp" value="<?php echo $area_ha; ?>" oninput="areaConverter(this.id,this.value)" onchange="areaConverter(this.value)">
+                        <small id="areahaHelp" class="form-text text-muted">in hectare's</small>
+                      </div>
+                      <div class="col">
+                        <label for="exampleInputEmail1">Area</label>
+                        <input type="text" class="form-control form-control-sm" id="area_ac" aria-describedby="areaacHelp" value="<?php echo $area_ac; ?>" oninput="areaConverter(this.id,this.value)" onchange="areaConverter(this.value)">
+                        <small id="areaaHelp" class="form-text text-muted">in acre's</small>
+                      </div>
+                      <div class="col">
+                        <label for="exampleInputEmail1">GPS</label>
+                        <input type="text" class="form-control form-control-sm" id="gps" aria-describedby="gpsHelp" value="<?php echo $gps; ?>" >
+                        <small id="gpsHelp" class="form-text text-muted"></small>
+                      </div>
+                  </div>
+                  
+                  <script>
+                	function areaConverter(source,valNum) {
+                		valNum = parseFloat(valNum);
+                		var area_ha = document.getElementById("area_ha");
+                		var area_ac = document.getElementById("area_ac");
+                		
+                		if (source=="area_ha") {
+                			area_ac.value=(valNum/0.404686).toFixed(2);
+                		}
+                		if (source=="area_ac") {
+                			area_ha.value=(valNum/2.4710559990832).toFixed(2);
+                		}
+                	}
+                  </script>
+                  
+                  <hr>
+                  <h6>Soil Clasification</h6>
+                  <div class="form-row">
+                      <div class="col">
+                        <label for="exampleInputEmail1">Area</label>
+                        <select class="form-control form-control-sm" name="analysis_type" id="analysis_type" required>
+                            <option>Select the type of soil...</option>
+                            <option id="sandy">sandy</option>
+                            <option id="light">light</option>
+                            <option id="medium">medium</option>
+                            <option id="heavy">heavy</option>
+                        </select>
+                      </div>
+                      <div class="col">
+                        <label for="exampleInputEmail1">Block Name</label>
+                        <input type="text" class="form-control form-control-sm" id="name" aria-describedby="idHelp" placeholder="Block Name">
+                        <small id="emailHelp" class="form-text text-muted"></small>
+                      </div>
+                  </div>
+                  
+                  <hr>
+                  <h6>Current Crop Details</h6>
+                  <div class="form-row">
+                      <div class="col">
+                        <label for="exampleInputEmail1">Block Name</label>
+                        <input type="text" class="form-control form-control-sm" id="name" aria-describedby="idHelp" placeholder="Block Name">
+                        <small id="emailHelp" class="form-text text-muted"></small>
+                      </div>
+                      <div class="col">
+                        <label for="exampleInputEmail1">Block Name</label>
+                        <input type="text" class="form-control form-control-sm" id="name" aria-describedby="idHelp" placeholder="Block Name">
+                        <small id="emailHelp" class="form-text text-muted"></small>
+                      </div>
+                      <div class="col">
+                        <label for="exampleInputEmail1">Block Name</label>
+                        <input type="text" class="form-control form-control-sm" id="name" aria-describedby="idHelp" placeholder="Block Name">
+                        <small id="emailHelp" class="form-text text-muted"></small>
+                      </div>
+                  </div>
+    
+                
+          </div>
+          <div class="modal-footer">
+            <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
+            <button form="editPaddock<?php echo $rowid; ?>" type="submit" class="btn btn-success">Save changes</button>
+            </form>
+          </div>
+        </div>
+      </div>
+    </div>
+
+
+<?php
+     $i++;
+    }
+}
+
+mysqli_close($con);
+?>
+                
+                </div>
+    	    </div>
+        </div>
+    
+    </div>
+</div>
+
+
+
+<div class="container-fluid">
+    <div class="row clearfix ">
+        <div class="col border border-success rounded shadow">
+            <form>
+                <div class="form-row">
+                    <div class="form-group col-3">
+                        <label for="farm_name">Farm Name</label>
+                        <input type="text" class="form-control" for="farm_name" placeholder="" readonly></input>
+                        <small id="farm_name" class="form-text text-muted"></small>
+                    </div>
+                    <div class="form-group col-3">
+                        <label for="paddock_name">Paddock Name</label>
+                        <input type="text" class="form-control" for="paddock_name" placeholder="" readonly></input>
+                        <small id="paddock_name" class="form-text text-muted"></small>
+                    </div>
+                    <div class="form-group col-3">
+                        <label for="crop_name">Crop Name</label>
+                        <input type="text" class="form-control" for="crop_name" placeholder="" readonly></input>
+                        <small id="crop_name" class="form-text text-muted"></small>
+                    </div>
+                    
+                    <div class="form-group col-3">
+                        <label for="paddock_area">Area</label>
+                        <input type="text" class="form-control" for="paddock_area" placeholder="" readonly></input>
+                        <small id="paddock_area" class="form-text text-muted"></small>
+                    </div>
+                </div>
+            </form>
+        </div>
+    </div>
+    
+    <div class="row clearfix">
+        <div class="col">
+            <br>
+            <h3>Crop Information</h3>
+        </div>
+    </div>
+        
+    <div class="row clearfix">
+        <div class="col-4 ">
+            <div class="card">
+                <div class="card-header">
+                    <h4>Current Alerts</h4>
+                </div>
+                <div class="card-body">
+                    <div class="table-responsive table-editable">
+                        <span class="table-add float-right mb-3 mr-2"><a href="#!" class="text-success"><i class="fas fa-plus fa-2x" aria-hidden="true"></i></a></span>
+                        <table class="table table-striped table-hover">
+                            <thead class="table-danger">
+                            <tr>
+                              <th scope="col">#</th>
+                              <th scope="col">First</th>
+                              <th scope="col">Last</th>
+                              <th scope="col">Handle</th>
+                            </tr>
+                            </thead>
+                            <tbody>
+                            <tr>
+                              <th scope="row">1</th>
+                              <td>Mark</td>
+                              <td>Otto</td>
+                              <td>@mdo</td>
+                            </tr>
+                            <tr>
+                              <th scope="row">2</th>
+                              <td>Jacob</td>
+                              <td>Thornton</td>
+                              <td>@fat</td>
+                            </tr>
+                            <tr>
+                              <th scope="row">3</th>
+                              <td>Larry</td>
+                              <td>the Bird</td>
+                              <td>@twitter</td>
+                            </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+        
+        <div class="col-4 ">
+            <div class="card">
+                <div class="card-header">
+                    <h4>Fertiliser and Disease Control</h4>
+                </div>
+                <div class="card-body">
+                    <div class="table-responsive table-editable">
+                        <span class="table-add float-right mb-3 mr-2"><a href="#!" class="text-success"><i class="fas fa-plus fa-2x" aria-hidden="true"></i></a></span>
+                        <table class="table table-striped table-hover">
+                            <thead class="table-success">
+                            <tr>
+                              <th scope="col">#</th>
+                              <th scope="col">First</th>
+                              <th scope="col">Last</th>
+                              <th scope="col">Handle</th>
+                            </tr>
+                            </thead>
+                            <tbody>
+                            <tr>
+                              <th scope="row">1</th>
+                              <td>Mark</td>
+                              <td>Otto</td>
+                              <td>@mdo</td>
+                            </tr>
+                            <tr>
+                              <th scope="row">2</th>
+                              <td>Jacob</td>
+                              <td>Thornton</td>
+                              <td>@fat</td>
+                            </tr>
+                            <tr>
+                              <th scope="row">3</th>
+                              <td>Larry</td>
+                              <td>the Bird</td>
+                              <td>@twitter</td>
+                            </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+        
+        <div class="col-4 ">
+            <div class="card">
+                <div class="card-header">
+                    <h4>Irrigation and Weather</h4>
+                </div>
+                <div class="card-body">
+                    <div class="table-responsive table-editable">
+                        <span class="table-add float-right mb-3 mr-2"><a href="#!" class="text-success"><i class="fas fa-plus fa-2x" aria-hidden="true"></i></a></span>
+                        <table class="table table-striped table-hover">
+                            <thead class="table-warning">
+                            <tr>
+                              <th scope="col">#</th>
+                              <th scope="col">First</th>
+                              <th scope="col">Last</th>
+                              <th scope="col">Handle</th>
+                            </tr>
+                            </thead>
+                            <tbody>
+                            <tr>
+                              <th scope="row">1</th>
+                              <td>Mark</td>
+                              <td>Otto</td>
+                              <td>@mdo</td>
+                            </tr>
+                            <tr>
+                              <th scope="row">2</th>
+                              <td>Jacob</td>
+                              <td>Thornton</td>
+                              <td>@fat</td>
+                            </tr>
+                            <tr>
+                              <th scope="row">3</th>
+                              <td>Larry</td>
+                              <td>the Bird</td>
+                              <td>@twitter</td>
+                            </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </div>
+        
+        
+    </div>
+    
+</div>
+					</div>
+
+				</div>
+
+			</main>
+			
+			<footer class="py-4 bg-light mt-auto">
+                <div class="container-fluid px-4">
+                    <div class="d-flex align-items-center justify-content-between small">
+                        <div class="text-muted">[[SimpleCopyright? &startYear=`2003`]]. All Rights Reserved <a href="[[~1]]"></a></div>
+                        <div>
+                            <a href="[[~39~]]">Privacy Policy</a>
+                            &middot;
+                            <a href="[[~39~]]">Terms &amp; Conditions</a>
+                        </div>
+                    </div>
+                </div>
+            </footer>
+            
+		</div>
+
+	</div>
+
+	<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
+	<script>
+    	/*!
+            * Start Bootstrap - SB Admin v7.0.3 (https://startbootstrap.com/template/sb-admin)
+            * Copyright 2013-2021 Start Bootstrap
+            * Licensed under MIT (https://github.com/StartBootstrap/startbootstrap-sb-admin/blob/master/LICENSE)
+            */
+            // 
+        // Scripts
+        // 
+        
+        window.addEventListener('DOMContentLoaded', event => {
+        
+            // Toggle the side navigation
+            const sidebarToggle = document.body.querySelector('#sidebarToggle');
+            if (sidebarToggle) {
+                // Uncomment Below to persist sidebar toggle between refreshes
+                // if (localStorage.getItem('sb|sidebar-toggle') === 'true') {
+                //     document.body.classList.toggle('sb-sidenav-toggled');
+                // }
+                sidebarToggle.addEventListener('click', event => {
+                    event.preventDefault();
+                    document.body.classList.toggle('sb-sidenav-toggled');
+                    localStorage.setItem('sb|sidebar-toggle', document.body.classList.contains('sb-sidenav-toggled'));
+                });
+            }
+        
+        });
+
+	</script>
+	<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.8.0/Chart.min.js" crossorigin="anonymous"></script>
+	<script src="https://cdn.jsdelivr.net/npm/simple-datatables@latest" crossorigin="anonymous"></script>
+</body>
+</html>

+ 1 - 1
lib/soil_calculations.php

@@ -5,7 +5,7 @@
  * Functions for soil analysis calculations and display
  */
 
-require_once __DIR__.'/database.php';
+require_once __DIR__.'/../config/database.php';
 
 /**
  * Calculate and display soil program for a specific element