aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'pollutometer-php/web')
-rw-r--r--pollutometer-php/web/.htaccess68
-rw-r--r--pollutometer-php/web/app.php21
-rw-r--r--pollutometer-php/web/app_dev.php31
-rw-r--r--pollutometer-php/web/apple-touch-icon.pngbin0 -> 2092 bytes
-rw-r--r--pollutometer-php/web/config.php422
-rw-r--r--pollutometer-php/web/favicon.icobin0 -> 6518 bytes
-rw-r--r--pollutometer-php/web/js/AllDataChart.js63
-rw-r--r--pollutometer-php/web/js/LastWeekDataChart.js63
-rw-r--r--pollutometer-php/web/js/realtime.js110
-rw-r--r--pollutometer-php/web/robots.txt5
10 files changed, 783 insertions, 0 deletions
diff --git a/pollutometer-php/web/.htaccess b/pollutometer-php/web/.htaccess
new file mode 100644
index 0000000..4dc7251
--- /dev/null
+++ b/pollutometer-php/web/.htaccess
@@ -0,0 +1,68 @@
+# Use the front controller as index file. It serves as a fallback solution when
+# every other rewrite/redirect fails (e.g. in an aliased environment without
+# mod_rewrite). Additionally, this reduces the matching process for the
+# start page (path "/") because otherwise Apache will apply the rewriting rules
+# to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl).
+DirectoryIndex app.php
+
+# By default, Apache does not evaluate symbolic links if you did not enable this
+# feature in your server configuration. Uncomment the following line if you
+# install assets as symlinks or if you experience problems related to symlinks
+# when compiling LESS/Sass/CoffeScript assets.
+# Options FollowSymlinks
+
+# Disabling MultiViews prevents unwanted negotiation, e.g. "/app" should not resolve
+# to the front controller "/app.php" but be rewritten to "/app.php/app".
+<IfModule mod_negotiation.c>
+ Options -MultiViews
+</IfModule>
+
+<IfModule mod_rewrite.c>
+ RewriteEngine On
+
+ # Determine the RewriteBase automatically and set it as environment variable.
+ # If you are using Apache aliases to do mass virtual hosting or installed the
+ # project in a subdirectory, the base path will be prepended to allow proper
+ # resolution of the app.php file and to redirect to the correct URI. It will
+ # work in environments without path prefix as well, providing a safe, one-size
+ # fits all solution. But as you do not need it in this case, you can comment
+ # the following 2 lines to eliminate the overhead.
+ RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
+ RewriteRule ^(.*) - [E=BASE:%1]
+
+ # Sets the HTTP_AUTHORIZATION header removed by Apache
+ RewriteCond %{HTTP:Authorization} .
+ RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+ # Redirect to URI without front controller to prevent duplicate content
+ # (with and without `/app.php`). Only do this redirect on the initial
+ # rewrite by Apache and not on subsequent cycles. Otherwise we would get an
+ # endless redirect loop (request -> rewrite to front controller ->
+ # redirect -> request -> ...).
+ # So in case you get a "too many redirects" error or you always get redirected
+ # to the start page because your Apache does not expose the REDIRECT_STATUS
+ # environment variable, you have 2 choices:
+ # - disable this feature by commenting the following 2 lines or
+ # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the
+ # following RewriteCond (best solution)
+ RewriteCond %{ENV:REDIRECT_STATUS} ^$
+ RewriteRule ^app\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
+
+ # If the requested filename exists, simply serve it.
+ # We only want to let Apache serve files and not directories.
+ RewriteCond %{REQUEST_FILENAME} -f
+ RewriteRule ^ - [L]
+
+ # Rewrite all other queries to the front controller.
+ RewriteRule ^ %{ENV:BASE}/app.php [L]
+</IfModule>
+
+<IfModule !mod_rewrite.c>
+ <IfModule mod_alias.c>
+ # When mod_rewrite is not available, we instruct a temporary redirect of
+ # the start page to the front controller explicitly so that the website
+ # and the generated links can still be used.
+ RedirectMatch 302 ^/$ /app.php/
+ # RedirectTemp cannot be used instead
+ </IfModule>
+</IfModule>
diff --git a/pollutometer-php/web/app.php b/pollutometer-php/web/app.php
new file mode 100644
index 0000000..943d089
--- /dev/null
+++ b/pollutometer-php/web/app.php
@@ -0,0 +1,21 @@
+<?php
+
+use Symfony\Component\HttpFoundation\Request;
+
+require __DIR__.'/../vendor/autoload.php';
+if (PHP_VERSION_ID < 70000) {
+ include_once __DIR__.'/../var/bootstrap.php.cache';
+}
+
+$kernel = new AppKernel('prod', false);
+if (PHP_VERSION_ID < 70000) {
+ $kernel->loadClassCache();
+}
+//$kernel = new AppCache($kernel);
+
+// When using the HttpCache, you need to call the method in your front controller instead of relying on the configuration parameter
+//Request::enableHttpMethodParameterOverride();
+$request = Request::createFromGlobals();
+$response = $kernel->handle($request);
+$response->send();
+$kernel->terminate($request, $response);
diff --git a/pollutometer-php/web/app_dev.php b/pollutometer-php/web/app_dev.php
new file mode 100644
index 0000000..d2ff583
--- /dev/null
+++ b/pollutometer-php/web/app_dev.php
@@ -0,0 +1,31 @@
+<?php
+
+use Symfony\Component\Debug\Debug;
+use Symfony\Component\HttpFoundation\Request;
+
+// If you don't want to setup permissions the proper way, just uncomment the following PHP line
+// read https://symfony.com/doc/current/setup.html#checking-symfony-application-configuration-and-setup
+// for more information
+//umask(0000);
+
+// This check prevents access to debug front controllers that are deployed by accident to production servers.
+// Feel free to remove this, extend it, or make something more sophisticated.
+if (isset($_SERVER['HTTP_CLIENT_IP'])
+ || isset($_SERVER['HTTP_X_FORWARDED_FOR'])
+ || !(in_array(@$_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1'], true) || PHP_SAPI === 'cli-server')
+) {
+ header('HTTP/1.0 403 Forbidden');
+ exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
+}
+
+require __DIR__.'/../vendor/autoload.php';
+Debug::enable();
+
+$kernel = new AppKernel('dev', true);
+if (PHP_VERSION_ID < 70000) {
+ $kernel->loadClassCache();
+}
+$request = Request::createFromGlobals();
+$response = $kernel->handle($request);
+$response->send();
+$kernel->terminate($request, $response);
diff --git a/pollutometer-php/web/apple-touch-icon.png b/pollutometer-php/web/apple-touch-icon.png
new file mode 100644
index 0000000..6e6b6ce
--- /dev/null
+++ b/pollutometer-php/web/apple-touch-icon.png
Binary files differ
diff --git a/pollutometer-php/web/config.php b/pollutometer-php/web/config.php
new file mode 100644
index 0000000..fd7e17e
--- /dev/null
+++ b/pollutometer-php/web/config.php
@@ -0,0 +1,422 @@
+<?php
+
+/*
+ * ************** CAUTION **************
+ *
+ * DO NOT EDIT THIS FILE as it will be overridden by Composer as part of
+ * the installation/update process. The original file resides in the
+ * SensioDistributionBundle.
+ *
+ * ************** CAUTION **************
+ */
+
+if (!isset($_SERVER['HTTP_HOST'])) {
+ exit("This script cannot be run from the CLI. Run it from a browser.\n");
+}
+
+if (!in_array(@$_SERVER['REMOTE_ADDR'], array(
+ '127.0.0.1',
+ '::1',
+))) {
+ header('HTTP/1.0 403 Forbidden');
+ exit('This script is only accessible from localhost.');
+}
+
+require_once dirname(__FILE__).'/../var/SymfonyRequirements.php';
+
+$symfonyRequirements = new SymfonyRequirements();
+
+$majorProblems = $symfonyRequirements->getFailedRequirements();
+$minorProblems = $symfonyRequirements->getFailedRecommendations();
+$hasMajorProblems = (bool) count($majorProblems);
+$hasMinorProblems = (bool) count($minorProblems);
+
+?>
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+ <meta name="robots" content="noindex,nofollow" />
+ <title>Symfony Configuration Checker</title>
+ <style>
+ /* styles copied from symfony framework bundle */
+ html {
+ background: #eee;
+ }
+ body {
+ font: 11px Verdana, Arial, sans-serif;
+ color: #333;
+ }
+ .sf-reset, .sf-reset .block, .sf-reset #message {
+ margin: auto;
+ }
+ img {
+ border: 0;
+ }
+ .clear {
+ clear: both;
+ height: 0;
+ font-size: 0;
+ line-height: 0;
+ }
+ .clear-fix:after {
+ content: "\0020";
+ display: block;
+ height: 0;
+ clear: both;
+ visibility: hidden;
+ }
+ .clear-fix {
+ display: inline-block;
+ }
+ * html .clear-fix {
+ height: 1%;
+ }
+ .clear-fix {
+ display: block;
+ }
+ .header {
+ padding: 30px 30px 20px 30px;
+ }
+ .header-logo {
+ float: left;
+ }
+ .search {
+ float: right;
+ padding-top: 20px;
+ }
+ .search label {
+ line-height: 28px;
+ vertical-align: middle;
+ }
+ .search input {
+ width: 195px;
+ font-size: 12px;
+ border: 1px solid #dadada;
+ background: #fff url(data:image/gif;base64,R0lGODlhAQAFAKIAAPX19e/v7/39/fr6+urq6gAAAAAAAAAAACH5BAAAAAAALAAAAAABAAUAAAMESAEjCQA7) repeat-x left top;
+ padding: 5px 6px;
+ color: #565656;
+ }
+ .search input[type="search"] {
+ -webkit-appearance: textfield;
+ }
+ #content {
+ width: 970px;
+ margin: 0 auto;
+ }
+ #content pre {
+ white-space: normal;
+ font-family: Arial, Helvetica, sans-serif;
+ }
+
+ /*
+ Copyright (c) 2010, Yahoo! Inc. All rights reserved.
+ Code licensed under the BSD License:
+ http://developer.yahoo.com/yui/license.html
+ version: 3.1.2
+ build: 56
+ */
+ .sf-reset div,.sf-reset dl,.sf-reset dt,.sf-reset dd,.sf-reset ul,.sf-reset ol,.sf-reset li,.sf-reset h1,.sf-reset h2,.sf-reset h3,.sf-reset h4,.sf-reset h5,.sf-reset h6,.sf-reset pre,.sf-reset code,.sf-reset form,.sf-reset fieldset,.sf-reset legend,.sf-reset input,.sf-reset textarea,.sf-reset p,.sf-reset blockquote,.sf-reset th,.sf-reset td{margin:0;padding:0;}.sf-reset table{border-collapse:collapse;border-spacing:0;}.sf-reset fieldset,.sf-reset img{border:0;}.sf-reset address,.sf-reset caption,.sf-reset cite,.sf-reset code,.sf-reset dfn,.sf-reset em,.sf-reset strong,.sf-reset th,.sf-reset var{font-style:normal;font-weight:normal;}.sf-reset li{list-style:none;}.sf-reset caption,.sf-reset th{text-align:left;}.sf-reset h1,.sf-reset h2,.sf-reset h3,.sf-reset h4,.sf-reset h5,.sf-reset h6{font-size:100%;font-weight:normal;}.sf-reset q:before,.sf-reset q:after{content:'';}.sf-reset abbr,.sf-reset acronym{border:0;font-variant:normal;}.sf-reset sup{vertical-align:text-top;}.sf-reset sub{vertical-align:text-bottom;}.sf-reset input,.sf-reset textarea,.sf-reset select{font-family:inherit;font-size:inherit;font-weight:inherit;}.sf-reset input,.sf-reset textarea,.sf-reset select{font-size:100%;}.sf-reset legend{color:#000;}
+ .sf-reset abbr {
+ border-bottom: 1px dotted #000;
+ cursor: help;
+ }
+ .sf-reset p {
+ font-size: 14px;
+ line-height: 20px;
+ padding-bottom: 20px;
+ }
+ .sf-reset strong {
+ color: #313131;
+ font-weight: bold;
+ }
+ .sf-reset a {
+ color: #6c6159;
+ }
+ .sf-reset a img {
+ border: none;
+ }
+ .sf-reset a:hover {
+ text-decoration: underline;
+ }
+ .sf-reset em {
+ font-style: italic;
+ }
+ .sf-reset h2,
+ .sf-reset h3 {
+ font-weight: bold;
+ }
+ .sf-reset h1 {
+ font-family: Georgia, "Times New Roman", Times, serif;
+ font-size: 20px;
+ color: #313131;
+ word-wrap: break-word;
+ }
+ .sf-reset li {
+ padding-bottom: 10px;
+ }
+ .sf-reset .block {
+ -moz-border-radius: 16px;
+ -webkit-border-radius: 16px;
+ border-radius: 16px;
+ margin-bottom: 20px;
+ background-color: #FFFFFF;
+ border: 1px solid #dfdfdf;
+ padding: 40px 50px;
+ word-break: break-all;
+ }
+ .sf-reset h2 {
+ font-size: 16px;
+ font-family: Arial, Helvetica, sans-serif;
+ }
+ .sf-reset li a {
+ background: none;
+ color: #868686;
+ text-decoration: none;
+ }
+ .sf-reset li a:hover {
+ background: none;
+ color: #313131;
+ text-decoration: underline;
+ }
+ .sf-reset ol {
+ padding: 10px 0;
+ }
+ .sf-reset ol li {
+ list-style: decimal;
+ margin-left: 20px;
+ padding: 2px;
+ padding-bottom: 20px;
+ }
+ .sf-reset ol ol li {
+ list-style-position: inside;
+ margin-left: 0;
+ white-space: nowrap;
+ font-size: 12px;
+ padding-bottom: 0;
+ }
+ .sf-reset li .selected {
+ background-color: #ffd;
+ }
+ .sf-button {
+ display: -moz-inline-box;
+ display: inline-block;
+ text-align: center;
+ vertical-align: middle;
+ border: 0;
+ background: transparent none;
+ text-transform: uppercase;
+ cursor: pointer;
+ font: bold 11px Arial, Helvetica, sans-serif;
+ }
+ .sf-button span {
+ text-decoration: none;
+ display: block;
+ height: 28px;
+ float: left;
+ }
+ .sf-button .border-l {
+ text-decoration: none;
+ display: block;
+ height: 28px;
+ float: left;
+ padding: 0 0 0 7px;
+ background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAcCAYAAACtQ6WLAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQtJREFUeNpiPHnyJAMakARiByDWYEGT8ADiYGVlZStubm5xlv///4MEQYoKZGRkQkRERLRYWVl5wYJQyXBZWdkwCQkJUxAHKgaWlAHSLqKiosb//v1DsYMFKGCvoqJiDmQzwXTAJYECulxcXNLoumCSoszMzDzoumDGghQwYZUECWIzkrAkSIIGOmlkLI10AiX//P379x8jIyMTNmPf/v79+ysLCwsvuiQoNi5//fr1Kch4dAyS3P/gwYMTQBP+wxwHw0xA4gkQ73v9+vUZdJ2w1Lf82bNn4iCHCQoKasHsZw4ODgbRIL8c+/Lly5M3b978Y2dn5wC6npkFLXnsAOKLjx49AmUHLYAAAwBoQubG016R5wAAAABJRU5ErkJggg==) no-repeat top left;
+ }
+ .sf-button .border-r {
+ padding: 0 7px 0 0;
+ background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAcCAYAAACtQ6WLAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAR1JREFUeNpiPHnyZCMDA8MNID5gZmb2nAEJMH7//v3N169fX969e/cYkL8WqGAHXPLv37//QYzfv39/fvPmzbUnT56sAXInmJub/2H5/x8sx8DCwsIrISFhDmQyPX78+CmQXs70798/BmQsKipqBNTgdvz4cWkmkE5kDATMioqKZkCFdiwg1eiAi4tLGqhQF24nMmBmZuYEigth1QkEbEBxTlySYPvJkwSJ00AnjYylgU6gxB8g/oFVEphkvgLF32KNMmCCewYUv4qhEyj47+HDhyeBzIMYOoEp8CxQw56wsLAncJ1//vz5/P79+2svX74EJc2V4BT58+fPd8CE/QKYHMGJOiIiAp6oWW7evDkNSF8DZYfIyEiU7AAQYACJ2vxVdJW4eQAAAABJRU5ErkJggg==) right top no-repeat;
+ }
+ .sf-button .btn-bg {
+ padding: 0 14px;
+ color: #636363;
+ line-height: 28px;
+ background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAcCAYAAACgXdXMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAClJREFUeNpiPnny5EKGf//+/Wf6//8/A4QAcrGzKCZwGc9sa2urBBBgAIbDUoYVp9lmAAAAAElFTkSuQmCC) repeat-x top left;
+ }
+ .sf-button:hover .border-l,
+ .sf-button-selected .border-l {
+ background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAcCAYAAACtQ6WLAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAR9JREFUeNpi/P//PwMyOHfunDqQSgNiexZkibNnzxYBqZa3HOs5v7PcYQBLnjlzhg1IbfzIdsTjA/t+ht9Mr8GKwZL//v3r+sB+0OMN+zqIEf8gFMvJkyd1gXTOa9YNDP//otrPAtSV/Jp9HfPff78Z0AEL0LUeXxivMfxD0wXTqfjj/2ugkf+wSrL9/YtpJEyS4S8WI5Ek/+GR/POPFjr//cenE6/kP9q4Fo/kr39/mdj+M/zFkGQCSj5i+ccPjLJ/GBgkuYOHQR1sNDpmAkb2LBmWwL///zKCIxwZM0VHR18G6p4uxeLLAA4tJMwEshiou1iMxXaHLGswA+t/YbhORuQUv2DBAnCifvxzI+enP3dQJUFg/vz5sOzgBBBgAPxX9j0YnH4JAAAAAElFTkSuQmCC) no-repeat top left;
+ }
+ .sf-button:hover .border-r,
+ .sf-button-selected .border-r {
+ background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAcCAYAAACtQ6WLAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAT5JREFUeNpiPHv27BkGBoaDQDzLyMjoJgMSYHrM3WX8hn1d0f///88DFRYhSzIuv2X5H8Rg/SfKIPDTkYH/l80OINffxMTkF9O/f/8ZQPgnwyuGl+wrGd6x7vf49+9fO9jYf3+Bkkj4NesmBqAV+SdPntQC6vzHgIz//gOawbqOGchOxtAJwp8Zr4F0e7D8/fuPAR38/P8eZIo0yz8skv8YvoIk+YE6/zNgAyD7sRqLkPzzjxY6/+HS+R+fTkZ8djLh08lCUCcuSWawJGbwMTGwg7zyBatX2Bj5QZKPsBrLzaICktzN8g/NWEYGZgYZjoC/wMiei5FMpFh8QPSU6Ojoy3Cd7EwiDBJsDgxiLNY7gLrKQGIsHAxSDHxAO2TZ/b8D+TVxcXF9MCtYtLiKLgDpfUDVsxITE1GyA0CAAQA2E/N8VuHyAAAAAABJRU5ErkJggg==) right top no-repeat;
+ }
+ .sf-button:hover .btn-bg,
+ .sf-button-selected .btn-bg {
+ color: #FFFFFF;
+ text-shadow:0 1px 1px #6b9311;
+ background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAcCAIAAAAvP0KbAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAEFJREFUeNpiPnv2LNMdvlymf///M/37B8R/QfQ/MP33L4j+B6Qh7L9//sHpf2h8MA1V+w/KRjYLaDaLCU8vQIABAFO3TxZriO4yAAAAAElFTkSuQmCC) repeat-x top left;
+ }
+
+ /* styles copied from bundles/sensiodistribution/webconfigurator/css/install.css */
+ body {
+ font-size: 14px;
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+ }
+ .sf-reset h1.title {
+ font-size: 45px;
+ padding-bottom: 30px;
+ }
+ .sf-reset h2 {
+ font-weight: bold;
+ color: #FFFFFF;
+ /* Font is reset to sans-serif (like body) */
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+ margin-bottom: 10px;
+ background-color: #aacd4e;
+ padding: 2px 4px;
+ display: inline-block;
+ text-transform: uppercase;
+ }
+ .sf-reset ul a,
+ .sf-reset ul a:hover {
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAICAYAAAAx8TU7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFdJREFUeNpiYACBjjOhDEiACSggCKTLgXQ5TJARqhIkcReIKxgqTGYxwvV0nDEGkmeAOIwJySiQ4HsgvseIpGo3ELsCtZ9lRDIvDCiwhwHJPEFkJwEEGACq6hdnax8y1AAAAABJRU5ErkJggg==) no-repeat right 7px;
+ padding-right: 10px;
+ }
+ .sf-reset ul, ol {
+ padding-left: 20px;
+ }
+ .sf-reset li {
+ padding-bottom: 18px;
+ }
+ .sf-reset ol li {
+ list-style-type: decimal;
+ }
+ .sf-reset ul li {
+ list-style-type: none;
+ }
+ .sf-reset .symfony-blocks-install {
+ overflow: hidden;
+ }
+ .sf-reset .symfony-install-continue {
+ font-size: 0.95em;
+ padding-left: 0;
+ }
+ .sf-reset .symfony-install-continue li {
+ padding-bottom: 10px;
+ }
+ .sf-reset .ok {
+ color: #fff;
+ font-family: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
+ background-color: #6d6;
+ padding: 10px;
+ margin-bottom: 20px;
+ }
+ .sf-reset .ko {
+ background-color: #d66;
+ }
+ .sf-reset p.help {
+ padding: 12px 16px;
+ word-break: break-word;
+ }
+ .version {
+ text-align: right;
+ font-size: 10px;
+ margin-right: 20px;
+ }
+ .sf-reset a,
+ .sf-reset li a {
+ color: #08C;
+ text-decoration: none;
+ }
+ .sf-reset a:hover,
+ .sf-reset li a:hover {
+ color: #08C;
+ text-decoration: underline;
+ }
+ .sf-reset textarea {
+ padding: 7px;
+ }
+ </style>
+ </head>
+ <body>
+ <div id="content">
+ <div class="header clear-fix">
+ <div class="header-logo">
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALYAAAA+CAMAAACxzRGDAAAAUVBMVEX////Ly8yko6WLioxkYmVXVVkwLjLl5eWxsLJKSEzy8vJxcHLY2Ni+vb89Oz9XVVh+fH+Yl5n///+xsbLY2Nlxb3KkpKWXlph+fX+LiYy+vr/IZP61AAAAAXRSTlMAQObYZgAABRBJREFUeNrVmtuWoyAQRS1FEEQSzQU7//+hYxUiXsKQZLJWM+chsUloN+WhCuguYoKyYqzmvGasKqH4HyRKxndipcgcumH8qViTM7TkUclcwaHmf5XM0eWq4km1KjdqXfMXJHVe1J3hL8lk5fCGv6wmT+o0d87U+XNrk0Y9nfv+7LM6ZJH5ZBL6LAbSxQ3Q5FDr22Skr8PQSy4n7isnsQxSX4r6pobhjCHHeDNOKrO3yGmCvZOjV9jmt8ulTdXFKdbKLNh+kOMvBzuVRa4Y7MUsdEUSWQe7xxCfZmcwjHU83LqzFvSbJQOXQvptbPnEFoyZtUUGwTeKuLuTHyT1kaP0P6cR01OKvv448gtl61dqZfmJezQmU/t+1R2fJLtBwXV6uWGwB9SZPrn0fKO2WAvQN1PUhHjTom3xgXYTkvlSKHs19OhslETq6X3HrXbjt8XbGj9b4Gi+lUAnL6XxQj8Pyk9N4Bt1xUrsLVN/3isYMug8rODMdbgOvoHs8uAb2fcANIAzkKCLYy+AXRpSU8sr1r4P67xhLgPp7vM32zlqt7Bhq2fI1Hwp+VgANxok59SsGV3oqdUL0YVDMRY7Yg8QLbVUU4NZNoOq5hJHuxEM28Sh/IyUZ8D3reR+yc58EGvOy2U0HQL6G9V+kWyEWHmzaMx6t4o9RhOm/riUiYrzqij4Ptqkn7AaCXqc+F47m04ahfde7YIz8RHEBN6BdVwdIGRVdNbKqYu1Hc0x0wBY4wqC8+XUgBGnj81SZsQB+0yAS1x/BlI/6ebHHk0lauQLuPDpu6EwAVJ7T0rl2uXa23jcqNyOZekhqYHRz3JOANrF4wCCmEs1f9D1lUe0n4NAATed80Y5e0Q7CO2TezM/BR6wKdgQzKbCF4uOQC3Bk0fKAzbFlyRWg3gksA/gmm7eOjrpaKX7fHlEW2xLbE6GZsPiCiShVzN7RG2xTz2G+OJtEqzdJ7APxy3MrSsV0VukXbKMp9lhs5BN6dr3CN+sySUaoxGwfRUM3I/gdPYONgVU+PLX4vUWm32AvUySarbONvcpV2RQEPKKjEBHFk01kQDGRblnn8ZuE9g+JUl8OWAPbkFK2K6JxhJVvF47FzYYnAN22ttwxKYCoH36rheEB7KG/HF/YUaa2G5JF+55tpyrl7B1WHM39HuP2N2EXPl1UBu8vbj4OjvD+NoTE4ssF+ScARgaJY1N7+u8bY/Y9BSM5PKwJbvMVab32YP5FB5TtcYVrGoASolVLTzI7kVsYVxRtAb5n2JXq1vCdtd47XtYItynrN0835PasLg0y13aOPbmPI+on2Lr9e5tjSHvgkAvclUjL3Fsdaw03IzgTR62yYClk7QMah4IQ0qSsoYYbOix6zJR1ZGDNMOY3Bb6W5S6jiyovep3t7bUPyoq7OkjYumrfESp8zSBc/OLosVf+nTnnKjsqR16++WDwpI8FxJWRFTlI6NKnqYJaL96TqjAbo9Toi5QiWBDcmfdFV+T8dkvFe5bItgstbM2X6QG2mVun+cazfRwOS0eiaeRRJKgLfc3BQAqfnhJyz8lfR6580SF/FXVu83Nz1xrrnFqqXL6Qxl47DNSm4RFflvN5sABDD8peouqLLKQXVdGbnqf+qIpOxON4ZyYdJEJ6sy4zS2c5eRPTT4Jyp46qDE5/ptAWqJOQ9e6yE82FXBbZCk1/tXVoshVoopE3CB0zmraI3nbqCJ/gW3ZMgtbC5nh/QHlOoOZBxQCRgAAAABJRU5ErkJggg==" alt="Symfony" />
+ </div>
+
+ <div class="search">
+ <form method="get" action="http://symfony.com/search">
+ <div class="form-row">
+
+ <label for="search-id">
+ <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAABUElEQVQoz2NgAIJ29iBdD0d7X2cPb+tY2f9MDMjgP2O2hKu7vS8CBlisZUNSMJ3fxRMkXO61wm2ue6I3iB1q8Z8ZriDZFCS03fm/wX+1/xp/TBo8QPxeqf+MUAW+QIFKj/+q/wX/c/3n/i/6Qd/bx943z/Q/K1SBI1D9fKv/AhCn/Wf5L5EHdFGKw39OqAIXoPpOMziX4T9/DFBBnuN/HqhAEtCKCNf/XDA/rZRyAmrpsvrPDVUw3wrkqCiLaewg6TohX1d7X0ffs5r/OaAKfinmgt3t4ulr4+Xg4ANip3j+l/zPArNT4LNOD0pAgWCSOUIBy3+h/+pXbBa5tni0eMx23+/mB1YSYnENroT5Pw/QSOX/mkCo+l/jgo0v2KJA643s8PgAmsMBDCbu/5xALHPB2husxN9uCzsDOgAq5kAoaZVnYMCh5Ky1r88Eh/+iABM8jUk7ClYIAAAAAElFTkSuQmCC" alt="Search on Symfony website" />
+ </label>
+
+ <input name="q" id="search-id" type="search" placeholder="Search on Symfony website" />
+
+ <button type="submit" class="sf-button">
+ <span class="border-l">
+ <span class="border-r">
+ <span class="btn-bg">OK</span>
+ </span>
+ </span>
+ </button>
+ </div>
+ </form>
+ </div>
+ </div>
+
+ <div class="sf-reset">
+ <div class="block">
+ <div class="symfony-block-content">
+ <h1 class="title">Configuration Checker</h1>
+ <p>
+ This script analyzes your system to check whether is
+ ready to run Symfony applications.
+ </p>
+
+ <?php if ($hasMajorProblems): ?>
+ <h2 class="ko">Major problems</h2>
+ <p>Major problems have been detected and <strong>must</strong> be fixed before continuing:</p>
+ <ol>
+ <?php foreach ($majorProblems as $problem): ?>
+ <li><?php echo $problem->getTestMessage() ?>
+ <p class="help"><em><?php echo $problem->getHelpHtml() ?></em></p>
+ </li>
+ <?php endforeach; ?>
+ </ol>
+ <?php endif; ?>
+
+ <?php if ($hasMinorProblems): ?>
+ <h2>Recommendations</h2>
+ <p>
+ <?php if ($hasMajorProblems): ?>Additionally, to<?php else: ?>To<?php endif; ?> enhance your Symfony experience,
+ it’s recommended that you fix the following:
+ </p>
+ <ol>
+ <?php foreach ($minorProblems as $problem): ?>
+ <li><?php echo $problem->getTestMessage() ?>
+ <p class="help"><em><?php echo $problem->getHelpHtml() ?></em></p>
+ </li>
+ <?php endforeach; ?>
+ </ol>
+ <?php endif; ?>
+
+ <?php if ($symfonyRequirements->hasPhpIniConfigIssue()): ?>
+ <p id="phpini">*
+ <?php if ($symfonyRequirements->getPhpIniConfigPath()): ?>
+ Changes to the <strong>php.ini</strong> file must be done in "<strong><?php echo $symfonyRequirements->getPhpIniConfigPath() ?></strong>".
+ <?php else: ?>
+ To change settings, create a "<strong>php.ini</strong>".
+ <?php endif; ?>
+ </p>
+ <?php endif; ?>
+
+ <?php if (!$hasMajorProblems && !$hasMinorProblems): ?>
+ <p class="ok">All checks passed successfully. Your system is ready to run Symfony applications.</p>
+ <?php endif; ?>
+
+ <ul class="symfony-install-continue">
+ <?php if ($hasMajorProblems || $hasMinorProblems): ?>
+ <li><a href="config.php">Re-check configuration</a></li>
+ <?php endif; ?>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="version">Symfony Standard Edition</div>
+ </div>
+ </body>
+</html>
diff --git a/pollutometer-php/web/favicon.ico b/pollutometer-php/web/favicon.ico
new file mode 100644
index 0000000..479f7f5
--- /dev/null
+++ b/pollutometer-php/web/favicon.ico
Binary files differ
diff --git a/pollutometer-php/web/js/AllDataChart.js b/pollutometer-php/web/js/AllDataChart.js
new file mode 100644
index 0000000..6525382
--- /dev/null
+++ b/pollutometer-php/web/js/AllDataChart.js
@@ -0,0 +1,63 @@
+var gasReading = {
+ Co: [],
+ No: [],
+ So: []
+};
+
+var canvas = document.querySelector('#ctx');
+var ctx = canvas.getContext('2d');
+
+var datasets = [{
+ label: "Co",
+ borderColor: "rgb(5, 0, 0)",
+ fill: false,
+ data: []
+}, {
+ label: "No",
+ borderColor: "rgb(69, 169, 230)",
+ fill: false,
+ data: []
+}, {
+ label: "So",
+ borderColor: "rgb(246, 250, 15)",
+ fill: false,
+ data: []
+}];
+
+fetch('/AllDataAverage')
+ .then(function(response) {
+ return response.json();
+ })
+ .then(function(data) {
+ drawChart(data, datasets);
+ });
+
+function drawChart(gasData, datasets) {
+
+ var finishedData = {
+ labels: []
+ };
+
+ Object.keys(gasData).forEach(function(key) {
+ finishedData.labels.push(key);
+ datasets[0].data.push(gasData[key].Co);
+ datasets[1].data.push(gasData[key].No);
+ datasets[2].data.push(gasData[key].So);
+ });
+
+ finishedData.datasets = datasets;
+
+ var myLineChart = new Chart(ctx, {
+ type: 'line',
+ data: finishedData,
+ options: {
+ scales: {
+ xAxes: [{
+ time: {
+ unit: 'day'
+ }
+ }]
+ }
+ }
+ });
+}
diff --git a/pollutometer-php/web/js/LastWeekDataChart.js b/pollutometer-php/web/js/LastWeekDataChart.js
new file mode 100644
index 0000000..b5e3976
--- /dev/null
+++ b/pollutometer-php/web/js/LastWeekDataChart.js
@@ -0,0 +1,63 @@
+var gasReading = {
+ Co: [],
+ No: [],
+ So: []
+};
+
+var canvas = document.querySelector('#ctx');
+var ctx = canvas.getContext('2d');
+
+var datasets = [{
+ label: "Co",
+ borderColor: "rgb(5, 0, 0)",
+ fill: false,
+ data: []
+}, {
+ label: "No",
+ borderColor: "rgb(69, 169, 230)",
+ fill: false,
+ data: []
+}, {
+ label: "So",
+ borderColor: "rgb(246, 250, 15)",
+ fill: false,
+ data: []
+}];
+
+fetch('/LastWeekDataAverage')
+ .then(function(response) {
+ return response.json();
+ })
+ .then(function(data) {
+ drawChart(data, datasets);
+ });
+
+function drawChart(gasData, datasets) {
+
+ var finishedData = {
+ labels: []
+ };
+
+ Object.keys(gasData).forEach(function(key) {
+ finishedData.labels.push(key);
+ datasets[0].data.push(gasData[key].Co);
+ datasets[1].data.push(gasData[key].No);
+ datasets[2].data.push(gasData[key].So);
+ });
+
+ finishedData.datasets = datasets;
+
+ var myLineChart = new Chart(ctx, {
+ type: 'line',
+ data: finishedData,
+ options: {
+ scales: {
+ xAxes: [{
+ time: {
+ unit: 'day'
+ }
+ }]
+ }
+ }
+ });
+}
diff --git a/pollutometer-php/web/js/realtime.js b/pollutometer-php/web/js/realtime.js
new file mode 100644
index 0000000..1f5ef22
--- /dev/null
+++ b/pollutometer-php/web/js/realtime.js
@@ -0,0 +1,110 @@
+function arrayMax(arr) {
+ var len = arr.length, max = -Infinity;
+ while (len--) {
+ if (arr[len] > max) {
+ max = arr[len];
+ }
+ }
+ return max;
+};
+
+
+const table = {
+ Co: {
+ breakpoints: [0, 4.4, 4.5, 9.4, 9.5, 12.4, 12.5, 15.4, 15.5, 30.4, 30.5, 40.4, 40.5, 50.4],
+ aq: [0, 50, 51, 100, 101, 150, 151, 200, 201, 300, 301, 400, 401, 500]
+ },
+ So: {
+ breakpoints: [0.000, 0.034, 0.035, 0.144, 0.145, 0.224, 0.225, 0.304, 0.305, 0.604, 0.605, 0.804, 0.805, 1.004],
+ aq:[0, 50, 51, 100, 101, 150, 151, 200, 201, 300, 301, 400, 401, 500]
+ },
+ No: {
+ breakpoints: [0.65, 1.24, 1.25, 1.64, 1.65, 2.04],
+ aq:[201, 300, 301, 400, 401, 500]
+ }
+};
+
+
+function calculateAQI(gasName, concentration) {
+ var bpLow,bpHi;
+ var bpLowIndex, bpHiIndex;
+
+ table[gasName].breakpoints.forEach(function(value, index) {
+ if(value <= concentration && table[gasName].breakpoints[index + 1] >= concentration) {
+ bpLow = value;
+ bpLowIndex = index;
+ }
+
+ if(value >= concentration && table[gasName].breakpoints[index - 1] <= concentration) {
+ bpHi = value;
+ bpHiIndex = index;
+ }
+
+ });
+
+
+
+ var airQualityIndex = ((table[gasName].aq[bpHiIndex] - table[gasName].aq[bpLowIndex]) / (bpHi - bpLow)) * (concentration - bpLow) + table[gasName].aq[bpLowIndex];
+
+ return airQualityIndex;
+
+}
+
+
+function update() {
+
+ var data;
+
+ fetch('/latest')
+ .then(function(resp) {
+ return resp.json();
+ })
+ .then(function(response) {
+ data = response;
+ var table = document.querySelector('#latest').children;
+ table[0].textContent = data.TimeStamp;
+ table[1].textContent = data.Co;
+ table[2].textContent = data.No;
+ table[3].textContent = data.So;
+
+ var indexes = [];
+ var CO = isNaN(calculateAQI("Co", data.Co)) ? 0 : calculateAQI("Co", data.Co);
+ var SO = isNaN(calculateAQI("So", data.So)) ? 0 : calculateAQI("So", data.So);
+ var NO = isNaN(calculateAQI("No", data.No)) ? 0 : calculateAQI("No", data.No);
+ indexes.push(CO);
+ indexes.push(NO);
+ indexes.push(SO);
+
+
+ var max = arrayMax(indexes);
+
+ document.querySelector("#aq").innerHTML = `The current air quality index is <strong>${max}</strong>`;
+
+ })
+ .catch(function(error) {
+ console.log(error);
+ });
+
+
+
+
+}
+
+function drawChart() {
+
+}
+
+setInterval(update, 10000);
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pollutometer-php/web/robots.txt b/pollutometer-php/web/robots.txt
new file mode 100644
index 0000000..4665fca
--- /dev/null
+++ b/pollutometer-php/web/robots.txt
@@ -0,0 +1,5 @@
+# www.robotstxt.org/
+# www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156449
+
+User-agent: *
+Disallow: