<?php
error_reporting(0);
    /* Include all the classes */ 
    require_once 'lib/swift_required.php';
    include_once("lib/classes/pChart/pColor.php"); 
    include_once("lib/classes/pChart/pDraw.php"); 
    include_once("lib/classes/pChart/pCharts.php");
use pChart\pColor;
use pChart\pDraw;
use pChart\pCharts;

function globalHandler($exception) {
    //this code should log the exception to disk and an error tracking system
    echo "Exception:" . $exception->getMessage();
}

set_exception_handler('globalHandler');


function arrayFlatten(array $array) {
	//Used for grabMongo function below.
	$flatten = array();
	array_walk_recursive($array, function($value) use(&$flatten) {
		$flatten[] = $value;
	});
	return $flatten;
};
function grabMongo($nameToFind,$pointsToCapture,$saving) {
	//Given name, time frame, and display state, return four arrays, temp, RH, (a third one that isn't used yet but could be in the future), and time.
	
	//Connect to Mongo database.
	$m = new MongoDB\Driver\Manager("mongodb://localhost:27017");
	//Search through chambers by name to get ID.
	$query = new MongoDB\Driver\Query([],['projection'=>['_id'=>1,'Name'=>1]]);
	$rows = $m->executeQuery('intelluscloud.chamber', $query); // $mongo contains the connection object to MongoDB
	foreach($rows as $r){
	   if(trim($r->Name)==trim($nameToFind)) {
		   $mongoID=$r->_id->__toString();
	   };
	};
	//Get list of timestamps to find latest possible times
	$query = new MongoDB\Driver\Query(['ChamberId'=> new MongoDB\BSON\ObjectId("$mongoID")] , ['projection'=>['Timestamp'=>1,'Count'=>1]]);
	$rows = $m->executeQuery('intelluscloud.chamberdata', $query); // $mongo contains the connection object to MongoDB
	$i=0;
	//Arrays of timestamps and counts.
	foreach($rows as $r){
	   $times[$i]=$r->Timestamp->toDateTime()->getTimestamp();
	   $counts[$i]=$r->Count;
	   $i++;
	};
	//Sort the timestamps and counts arrays by the timestamp.
	array_multisort($times,$counts); //Shit like this is why I love php.
	rsort($times);  //Reversing so the last elements come first, which are the points needed for the graphs.
	rsort($counts); //Look ma, no loops!  Just a really good standard library!
	//Grab the previous $pointsToCapture number of Temperature and RH points as y axis arrays, keep track of timestamps in x axis array.
	$counter=0;
	$i=0;
	$PV1Values=[];
	$PV2Values=[];
	//$PV3Values=[];
	//$EO1Values=[];
	$timeValues=[];
	if($saving==1) {
	    $refreshRate=1;
	} else {
	    $refreshRate=intval(round($pointsToCapture/120));
	};
	while(($counter<=$pointsToCapture)&&($i<10090)) { //Not to go longer than one week.
		if(empty($times[$i])) {
			$times[$i]=$times[$i-1]+1;
		};
		$query = new MongoDB\Driver\Query(['ChamberId'=> new MongoDB\BSON\ObjectId("$mongoID"),'Timestamp' => new MongoDB\BSON\UTCDateTime($times[$i]*1000)]); //UTCDateTime needs milliseconds.
		$rows = $m->executeQuery('intelluscloud.chamberdata', $query); // $mongo contains the connection object to MongoDB
		//Arrays of timestamps and counts.
		foreach($rows as $r){
			$flag1=isset($r->Inputs->PV_1->Values);
			$flag2=isset($r->Inputs->PV_2->Values);
			//$flag3=isset($r->Inputs->PV_3->Values);
			//$flag4=isset($r->Lights->EO_1->Values);
			if($flag1==1) $v1=$r->Inputs->PV_1->Values;
			if($flag2==1) $v2=$r->Inputs->PV_2->Values;
			//if($flag3==1) $v3=$r->Inputs->PV_3->Values;
			//if($flag4==1) $v4=$r->Lights->EO_1->Values;
			if($flag1==1) {
				$l=count($v1);
			}else{
				$l=0;
			};
			$x=array();$y1=array();$y2=array();//$y4=array();
			for($j=0;$j<$l;$j++) {
				$counter++;
				if($counter%$refreshRate==0){
					if($flag1==1) $y1[]=$v1[$l-1-$j];
					if($flag2==1) $y2[]=$v2[$l-1-$j];
					//if($flag3==1) $y3[]=$v3[$l-1-$j];
					//if($flag4==1) $y4[]=$v4[$l-1-$j];
					$x[] =$times[$i]+60*($l-1-$j)+21600; //TODO:  Add DST adjustment
				};
			};
			if($flag1==1) array_push($PV1Values,$y1);
			if($flag2==1) array_push($PV2Values,$y2);
			//if($flag3==1) array_push($PV3Values,$y3);
			//if($flag4==1) array_push($EO1Values,$y4);
			array_push($timeValues,$x);
		};
		$i++;
		//$counter=$counter+$counts[$i];
	};
	if($flag1==1) $PV1Values=arrayFlatten($PV1Values);
	if($flag2==1) $PV2Values=arrayFlatten($PV2Values);
	//if($flag3==1) $PV3Values=arrayFlatten($PV3Values);
	//if($flag4==1) $EO1Values=arrayFlatten($EO1Values);
	$timeValues=arrayFlatten($timeValues);
	$package["PV1Values"]=$PV1Values;
	$package["PV2Values"]=$PV2Values;
	//$package["PV3Values"]=$PV3Values;
	//$package["EO1Values"]=$EO1Values;
	$package["timeValues"]=$timeValues;
	return $package;
}
function grabMongoChamber($nameToFind,$pointsToCapture,$saving) {
	//Given name, time frame, and display state, return four arrays, temp, RH, (a third one that isn't used yet but could be in the future), and time.
	
	//Connect to Mongo database.
	$m = new MongoDB\Driver\Manager("mongodb://localhost:27017");
	//Search through chambers by name to get ID.
	$query = new MongoDB\Driver\Query([],['projection'=>['_id'=>1,'Name'=>1]]);
	$rows = $m->executeQuery('intelluscloud.chamber', $query); // $mongo contains the connection object to MongoDB
	foreach($rows as $r){
	   if(trim($r->Name)==trim($nameToFind)) {
		   $mongoID=$r->_id->__toString();
	   };
	};
	if(empty($mongoID)) {
		throw new Exception("Could not grab chamber data.");
	};
	//Get list of timestamps to find latest possible times
	$query = new MongoDB\Driver\Query(['ChamberId'=> new MongoDB\BSON\ObjectId("$mongoID")] , ['projection'=>['Timestamp'=>1,'Count'=>1]]);
	$rows = $m->executeQuery('intelluscloud.chamberdata', $query); // $mongo contains the connection object to MongoDB
	$i=0;
	//Arrays of timestamps and counts.
	foreach($rows as $r){
	   $times[$i]=$r->Timestamp->toDateTime()->getTimestamp();
	   $counts[$i]=$r->Count;
	   $i++;
	};
	//Sort the timestamps and counts arrays by the timestamp.
	array_multisort($times,$counts); //Shit like this is why I love php.
	rsort($times);  //Reversing so the last elements come first, which are the points needed for the graphs.
	rsort($counts); //Look ma, no loops!  Just a really good standard library!
	//Grab the previous $pointsToCapture number of Temperature and RH points as y axis arrays, keep track of timestamps in x axis array.
	$counter=0;
	$i=0;
	$PV1Values=[];
	$PV2Values=[];
	$SP1Values=[];
	$SP2Values=[];
	//$PV3Values=[];
	$EO1Values=[];
	$timeValues=[];
	if($saving==1) {
	    $refreshRate=1;
	} else {
	    $refreshRate=intval(round($pointsToCapture/120));
	};
	$max=min(10090,sizeof($times));
	while(($counter<=$pointsToCapture)&&($i<$max)) { //Not to go longer than one week.
		$query = new MongoDB\Driver\Query(['ChamberId'=> new MongoDB\BSON\ObjectId("$mongoID"),'Timestamp' => new MongoDB\BSON\UTCDateTime($times[$i]*1000)]); //UTCDateTime needs milliseconds.
		$rows = $m->executeQuery('intelluscloud.chamberdata', $query); // $mongo contains the connection object to MongoDB
		//Arrays of timestamps and counts.
		foreach($rows as $r){
			$flag1=isset($r->Inputs->PV_1->Values);
			$flag2=isset($r->Inputs->PV_2->Values);
			//$flag3=isset($r->Inputs->PV_3->Values);
			$flag4=isset($r->Lights->EO_1->Values);
			$flag5=isset($r->Inputs->PV_1->SetPoints);
			$flag6=isset($r->Inputs->PV_2->SetPoints);
			if($flag1==1) $v1=$r->Inputs->PV_1->Values;
			if($flag2==1) $v2=$r->Inputs->PV_2->Values;
			//if($flag3==1) $v3=$r->Inputs->PV_3->Values;
			if($flag4==1) $v4=$r->Lights->EO_1->Values;
			if($flag5==1) $v5=$r->Inputs->PV_1->SetPoints;
			if($flag6==1) $v6=$r->Inputs->PV_2->SetPoints;
			$x=array();$y1=array();$y2=array();$y4=array();$y5=array();$y6=array();
			if($flag1==1) {
				$l=count($v1);
			}else{
				$l=0;
			};
			for($j=0;$j<$l;$j++) {
				$counter++;
				if($counter%$refreshRate==0){
					if($flag1==1) $y1[]=$v1[$l-1-$j];
					$x[] =$times[$i]+60*($l-1-$j)+21600; //TODO:  Add DST adjustment
				};
			};
			if($flag2==1) {
				$l=count($v2);
			}else{
				$l=0;
			};
			for($j=0;$j<$l;$j++) {
				$counter++;
				if($counter%$refreshRate==0){
					if($flag2==1) $y2[]=$v2[$l-1-$j];
					$x[] =$times[$i]+60*($l-1-$j)+21600; //TODO:  Add DST adjustment
				};
			};
			if($flag4==1) {
				$l=count($v4);
			}else{
				$l=0;
			};
			for($j=0;$j<$l;$j++) {
				$counter++;
				if($counter%$refreshRate==0){
					if($flag4==1) $y4[]=$v4[$l-1-$j];
					$x[] =$times[$i]+60*($l-1-$j)+21600; //TODO:  Add DST adjustment
				};
			};
			if($flag5==1) {
				$l=count($v5);
			}else{
				$l=0;
			};
			for($j=0;$j<$l;$j++) {
				$counter++;
				if($counter%$refreshRate==0){
					if($flag5==1) $y5[]=$v5[$l-1-$j];
					$x[] =$times[$i]+60*($l-1-$j)+21600; //TODO:  Add DST adjustment
				};
			};
			if($flag6==1) {
				$l=count($v6);
			}else{
				$l=0;
			};
			for($j=0;$j<$l;$j++) {
				$counter++;
				if($counter%$refreshRate==0){
					if($flag6==1) $y6[]=$v6[$l-1-$j];
					$x[] =$times[$i]+60*($l-1-$j)+21600; //TODO:  Add DST adjustment
				};
			};
			if($flag1==1) array_push($PV1Values,$y1);
			if($flag2==1) array_push($PV2Values,$y2);
			//if($flag3==1) array_push($PV3Values,$y3);
			if($flag4==1) array_push($EO1Values,$y4);
			if($flag5==1) array_push($SP1Values,$y5);
			if($flag6==1) array_push($SP2Values,$y6);
			array_push($timeValues,$x);
		};
		$i++;
		//$counter=$counter+$counts[$i];
	};
	if($flag1==1) $PV1Values=arrayFlatten($PV1Values);
	if($flag2==1) $PV2Values=arrayFlatten($PV2Values);
	//if($flag3==1) $PV3Values=arrayFlatten($PV3Values);
	if($flag4==1) $EO1Values=arrayFlatten($EO1Values);
	if($flag5==1) $SP1Values=arrayFlatten($SP1Values);
	if($flag6==1) $SP2Values=arrayFlatten($SP2Values);
	$timeValues=arrayFlatten($timeValues);
	$package["PV1Values"]=$PV1Values;
	$package["PV2Values"]=$PV2Values;
	$package["SP1Values"]=$SP1Values;
	$package["SP2Values"]=$SP2Values;
	//$package["PV3Values"]=$PV3Values;
	$package["EO1Values"]=$EO1Values;
	$package["timeValues"]=$timeValues;
	return $package;
}
function grabChartInfo($logger,$time) {
	//Given logger and zoom level, grab chamber enter/exit timestamps, test start/stop timestamps, and comment timestamps.
	$db=new PDO("mysql:host=localhost;dbname=chambertestdata;port=3306;charset=utf8","root","");
	//Select comments after timestamp.
	$prep="SELECT note,unixTime FROM comments INNER JOIN loggers ON comments.logID=loggers.logID WHERE logger=? AND unixTime>?";
	$stmt=$db->prepare($prep);
	$executionArray=["{$logger}","{$time}"];
	$stmt->execute($executionArray);
	$commentArray=$stmt->fetchAll();
	//Select chambers after timestamp.
	$prep="SELECT flagStartEndChamber,so,unixTime FROM chambers INNER JOIN loggers ON chambers.logID=loggers.logID WHERE logger=? AND unixTime>?";
	$stmt=$db->prepare($prep);
	$executionArray=["{$logger}","{$time}"];
	$stmt->execute($executionArray);
	$chamberArray=$stmt->fetchAll();
	//Select tests after timestamp.
	$prep="SELECT flagStartEndTest,testType,unixTime FROM loggers INNER JOIN tests ON loggers.logID=tests.logID WHERE logger=? AND unixTime>?";
	$stmt=$db->prepare($prep);
	$executionArray=["{$logger}","{$time}"];
	$stmt->execute($executionArray);
	$testArray=$stmt->fetchAll();
	//$prep="INSERT INTO master(timestamp,serial,testType,logger,year,month,day,hour,minute,Temp,RH,PPM,runningFlag,doorFlag) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
	//$stmt=$db->prepare($prep);
	//$status=$stmt->execute($executionArray);
	//$myfile=fopen("\\\\SRVFILEPERC\Departments\Engineering\Data\ChamberQualityControlData\\"."$SONumber"."_$testType"."_$name"."_$timestamp.csv","w");
	$package["comments"]=$commentArray;
	$package["chambers"]=$chamberArray;
	$package["tests"]=$testArray;
	$db=null;
	return $package;
}
//Putting this as a global because in this case optimality and runtime trumps code readability.
//Well, I mean, not that this was at all particularly readable anyways...
$db=new PDO("mysql:host=localhost;dbname=chambertestdata;port=3306;charset=utf8","root","");
$query="SELECT MAX(unixTime),so,ip,mac,logger,flagStartEndChamber FROM chambers INNER JOIN loggers ON chambers.logID=loggers.logID GROUP BY logger,flagStartEndChamber,so,ip,mac";
$query="
SELECT l.unixTime,c.so, c.ip, c.mac, l.logger, c.flagStartEndChamber
FROM chambers AS c
INNER JOIN loggers AS l ON c.logID = l.logID
INNER JOIN (
    SELECT MAX(unixTime) as maxUnixTime, logger, flagStartEndChamber
    FROM chambers
    INNER JOIN loggers on chambers.logID=loggers.logID
    GROUP BY logger, flagStartEndChamber
) AS subq ON l.logger = subq.logger
    AND c.flagStartEndChamber = subq.flagStartEndChamber
    AND l.unixTime = subq.maxUnixTime
";
$stmt=$db->prepare($query);
$executionArray=[];
$stmt->execute($executionArray);
$chamberStartEndArray=$stmt->fetchAll();
function findUnixTime($array, $givenLogger, $givenFlag){
	$temp=null;
	foreach($array as $row){
		if($row['logger'] == $givenLogger && $row['flagStartEndChamber'] == $givenFlag){
			$temp=$row;//['unixTime'];
		}
	}
	return $temp;
}
function lastChamberStart($logger) {
	//Return last timestamp associated to a chamber beginning.
//	$db=new PDO("mysql:host=localhost;dbname=chambertestdata;port=3306;charset=utf8","root","");
//	$prep="SELECT unixTime,so,ip,mac FROM chambers INNER JOIN loggers ON chambers.logID=loggers.logID WHERE logger=? AND flagStartEndChamber=1 AND unixTime>? ORDER BY unixTime DESC LIMIT 1";
//	$stmt=$db->prepare($prep);
//	$executionArray=["{$logger}",date('Y-m-d',strtotime('-1 month'))];
//	$stmt->execute($executionArray);
//	$entry=$stmt->fetch();
	global $chamberStartEndArray;
	$entry=findUnixTime($chamberStartEndArray,$logger,1);
	if($entry) { return $entry; } else { return array(0);};
}
function lastChamberEnd($logger) {
	//Return last timestamp associated to a chamber ending.
//	$db=new PDO("mysql:host=localhost;dbname=chambertestdata;port=3306;charset=utf8","root","");
//	$prep="SELECT unixTime FROM chambers INNER JOIN loggers ON chambers.logID=loggers.logID WHERE logger=? AND flagStartEndChamber=0 AND unixTime>? ORDER BY unixTime DESC LIMIT 1";
//	//$prep="SELECT unixTime FROM chambers WHERE logID = (SELECT logID FROM loggers WHERE logger = ? AND flagStartEndChamber=0 ORDER BY unixTime DESC) AND flagStartEndChamber=0 ORDER BY unixTime DESC LIMIT 1";
//	$stmt=$db->prepare($prep);
//	$executionArray=["{$logger}",date('Y-m-d',strtotime('-1 month'))];
//	$stmt->execute($executionArray);
//	$entry=$stmt->fetch();
	global $chamberStartEndArray;
	$entry=findUnixTime($chamberStartEndArray,$logger,0);
	if($entry) { return $entry; } else { return array(1);};
}
function lastTestStart($logger) {
	//Return last timestamp associated to a chamber beginning.
	$dbname="chambertestdata";
	$db=new PDO("mysql:host=localhost;dbname=chambertestdata;port=3306;charset=utf8","root","");
	$prep="SELECT unixTime,testType FROM loggers INNER JOIN tests ON tests.logID=loggers.logID WHERE logger=? AND flagStartEndTest=1 ORDER BY unixTime DESC LIMIT 1";
	$stmt=$db->prepare($prep);
	$executionArray=["{$logger}"];
	$stmt->execute($executionArray);
	$entry=$stmt->fetch();
	if(!$entry) { return array(0);}
	return $entry;
}
function lastTestEnd($logger) {
	//Return last timestamp associated to a chamber ending.
	$dbname="chambertestdata";
	$db=new PDO("mysql:host=localhost;dbname=chambertestdata;port=3306;charset=utf8","root","");
	$prep="SELECT unixTime FROM loggers INNER JOIN tests ON tests.logID=loggers.logID WHERE logger=? AND flagStartEndTest=0 ORDER BY unixTime DESC LIMIT 1";
	$stmt=$db->prepare($prep);
	$executionArray=["{$logger}"];
	$stmt->execute($executionArray);
	$entry=$stmt->fetch();
	if(!$entry) { return 1;}
	return $entry[0];
}
function populatePage($logger) {
	$lastChamberStart=lastChamberStart($logger);
	$lastTestStart=lastTestStart($logger);
	if($lastChamberStart[0]<lastChamberEnd($logger)) {
		$chamberIn=0;
		$ip='';
		$so='';
	} else {
		$chamberIn=1;
		$so=$lastChamberStart[1];
		$ip=$lastChamberStart[2];
	};
	if($lastTestStart[0]<lastTestEnd($logger)) {
		$testIn=0;
	} else {
		$testIn=1;
	};
	echo "    <form action='index.php' method='POST' enctype='multipart/form-data'>";
	echo "    <table style='margin:auto' class='btn-group-justified'>";
	echo "    <tr>";
	if(!$chamberIn) {
	echo "    <td>";
	echo "    <input type='submit' class='btn btn-primary btn-3d' name='btn' value='Enter Chamber'/>";
	echo "    </td>";
	} else {
	echo "    <td>";
	echo "    </td>";
	};
	echo "    <td>";
//	echo "    <input type='text' class='form-control' name='ip' id='ip' value='{$ip}' placeholder='ex. 10.2.0.XXX' title='Please input IP address' maxlength='15'>";
	echo "    </td>";
	echo "    <td>";
	echo "    <input type='text' class='form-control' name='so' id='so' value='{$so}' placeholder='ex. 034090.02.19' title='Please input chamber SO#' maxlength='12'>";
	echo "    </td>";
	if(($chamberIn)&&(!$testIn)) {
	echo "    <td>";
	echo "    <input type='submit' class='btn btn-primary btn-3d' name='btn' value='Remove Chamber'/>";
	echo "    </td>";
	} else {
	echo "    <td>";
	echo "    </td>";
	};
	echo "    </tr>";
	echo "    <tr>";
	if((!$testIn)&&($chamberIn)) {
	echo "    <td>";
	echo "    <input type='submit' class='btn btn-primary btn-3d' name='btn' value='Start Test'/>";
	echo "    </td>";
	echo "    <td>";
	echo "        <select class='form-control' name='testType' id='testType'>";
	echo "        <option value='NA'>Other Testing</option>";
	/*
	echo "        <optgroup label='Testing'>";
	echo "        <option value='Temp'>Temperature Testing</option>";
	echo "        <option value='Hum'>Humidification Testing</option>";
	echo "        <option value='Dehum'>Dehumidification Testing</option>";
	echo "        <option value='High'>High Temperature Testing</option>";
	echo "        </optgroup>";
	echo "        <optgroup label='Manual'>";
	echo "        <option value='25'>Manual 25C Temperature</option>";
	echo "        </optgroup>";
	echo "        <optgroup label='I HOPE YOU KNOW WHAT YOU ARE DOING'>";
	echo "        <option value='recalib'>Logger Recalibration</option>";
	echo "        </optgroup>";
	echo "    <!--";
	echo "        <option value='hum'>Humidity Testing</option>";
	echo "        <option value='dehum'>Dehumidify Testing</option>";
	echo "        <option value='CO2'>CO2 Testing</option>";
	echo "    -->";
	 */
	echo "        </select>";
	echo "    </td>";
	} else {
	echo "    <td>";
	echo "    </td>";
	echo "    <td name='testType' id='testType' value=''>";
	echo "    </td>";
	};
	if($testIn&&$chamberIn) {
	echo "    <td>";
	echo "    <input type='submit' class='btn btn-primary btn-3d' name='btn' value='End and Reject Test'/>";
	echo "    </td>";
	echo "    <td>";
	echo "    <input type='submit' class='btn btn-primary btn-3d' name='btn' value='End and Submit Test'/>";
	echo "    </td>";
	};
	echo "    </tr>";
	echo "    <tr>";
	echo "    <td>";
	echo "    <input type='submit' class='btn btn-primary btn-3d' name='btn' value='Hour Zoom'/>";
	echo "    </td>";
	echo "    <td>";
	echo "    <input type='submit' class='btn btn-primary btn-3d' name='btn' value='Day Zoom'/>";
	echo "    </td>";
	echo "    <td>";
	echo "    <input type='submit' class='btn btn-primary btn-3d' name='btn' value='Weekend Zoom'/>";
	echo "    </td>";
	if($chamberIn) {
	echo "    <td>";
	echo "    <input type='submit' class='btn btn-primary btn-3d' name='btn' value='Apply Night Offset'/>";
	echo "    </td>";
	};
	echo "    </tr>";
	echo "    <tr>";
	echo "    <td>";
	echo "    <input type='submit' class='btn btn-primary btn-3d' name='btn' value='Door Opened'/>";
	echo "    </td>";
	echo "    <td>";
	echo "    <input type='submit' class='btn btn-primary btn-3d' name='btn' value='Comment'/>";
	echo "    </td>";
	echo "    <td>";
	echo "    <input type='text' class='form-control' name='note' id='note' value='' placeholder='ex. Replaced Valve' title='Please input Comment' maxlength='20'>";
	echo "    </td>";
	if($chamberIn) {
	echo "    <td>";
	echo "    <input type='submit' class='btn btn-primary btn-3d' name='btn' value='Apply Day Offset'/>";
	echo "    </td>";
	};
	echo "    </tr>";
	echo "    </table>";
	echo "    </form>";
}
function modal($title,$message) {
	echo "    <div class='modal fade' id='mod' tabindex='-1' role='dialog' aria-labelledby='myModalLabel' aria-hidden='true'>";
	echo "        <div class='modal-dialog'>";
	echo "            <div class='modal-content'>";
	echo "                <div class='modal-header'>";
	echo "                    <button type='button' class='close' data-dismiss='modal' aria-hidden='true'>&times;</button>";
	echo "                    <h4 class='modal-title' id='myModalLabel'>$title</h4>";
	echo "                </div>";
	echo "                <div class='modal-body'>";
	echo "                    <p id='modalText'>$message</p>";
	echo "                </div>";
	echo "            </div>";
	echo "        </div>";
	echo "    </div>";
}
function createChart($logger,$zoomLevel,$so,$mac) {
	//TODO:  Advanced feature
	//Grab logger data.
	$loggerData=grabMongo($logger,$zoomLevel,0);
	$n=sizeof($loggerData["PV1Values"]);
	$loggerTemperature=array($n);
	$loggerRH=array($n);
	foreach($loggerData["PV1Values"] as $key=>$value) { $loggerTemperature[$key]=floatval($value/1000);};
	$loggerTemperature=array_reverse($loggerTemperature);
	foreach($loggerData["PV2Values"] as $key=>$value) { $loggerRH[$key]=floatval($value/1000);};
	$loggerRH=array_reverse($loggerRH);
	foreach($loggerData["timeValues"] as $key=>$value) { $time[$key]=$value-6*3600;};
	$time=array_reverse($time);//ambientData["timeValues"]);
	//Grab ambient data.
//	$ambientData=grabMongo('A1',$zoomLevel,0);
//	$ambientTemperature=$ambientData["PV1Values"];
//	$n=sizeof($ambientData["PV1Values"]);
//	$ambientTemperature=array($n);
//	$ambientRH=array($n);
//	foreach($ambientData["PV1Values"] as $key=>$value) { $ambientTemperature[$key]=floatval($value/1000);};
//	$ambientTemperature=array_reverse($ambientTemperature);
//	foreach($ambientData["PV2Values"] as $key=>$value) { $ambientRH[$key]=floatval($value/1000);};
//	$ambientRH=array_reverse($ambientRH);
//	foreach($ambientData["timeValues"] as $key=>$value) { $time[$key]=$value-6*3600;};
	//Grab chamber data, if applicable.
	if($mac) {
		try {
			$chamberData=grabMongoChamber("Chamber ".$mac,$zoomLevel,0);
			foreach($chamberData["PV1Values"] as $key=>$value) { $chamberTemperature[$key]=floatval($value/1000);};
			if(empty($chamberTemperature)) {
				throw new Exception("Chamber data is not sufficiently large yet.");
			};
			$chamberTemperature=array_pad($chamberTemperature,$n,0);
			$chamberTemperature=array_reverse($chamberTemperature);
			$chamberTemperature=array_slice($chamberTemperature,0,$n);
			$chamberRH=null;
			foreach($chamberData["PV2Values"] as $key=>$value) { $chamberRH[$key]=floatval($value/1000);};
			if($chamberRH) {
				$chamberRH=array_pad($chamberRH,$n,0);
				$chamberRH=array_reverse($chamberRH);
				$chamberRH=array_slice($chamberRH,0,$n);
			};
			foreach($chamberData["SP1Values"] as $key=>$value) { $chamberTemperatureSP[$key]=floatval($value/1000);};
			$chamberTemperatureSP=array_pad($chamberTemperatureSP,$n,0);
			$chamberTemperatureSP=array_reverse($chamberTemperatureSP);
			$chamberTemperatureSP=array_slice($chamberTemperatureSP,0,$n);
	//		foreach($chamberData["SP2Values"] as $key=>$value) { $chamberRHSP[$key]=floatval($value/1000);};
	//		$chamberRHSP=array_pad($chamberRHSP,$n,0);
	//		$chamberRHSP=array_reverse($chamberRHSP);
			foreach($chamberData["EO1Values"] as $key=>$value) { $chamberLights[$key]=floatval($value/1000);};
			$chamberLights=array_pad($chamberLights,$n,0);
			$chamberLights=array_reverse($chamberLights);
			$chamberLights=array_slice($chamberLights,0,$n);
		} catch(Exception $e) {
			echo $e->getMessage();
			$chamberData=[];
		}
	};
    /* Create your dataset object */ 
    $myPicture= new pDraw(1150,720); 
    /* Add data in your dataset */ 
    $myPicture->myData->addPoints($loggerTemperature,"Logger Temp");
    $myPicture->myData->addPoints($loggerRH,"Logger RH");
//    $myPicture->myData->addPoints($ambientTemperature,"Ambient Temp");
//    $myPicture->myData->addPoints($ambientRH,"Ambient RH");
	if($mac&&!empty($chamberData)) {
	    $myPicture->myData->addPoints($chamberTemperature,"Chamber Temp PV");
	    $myPicture->myData->addPoints($chamberTemperatureSP,"Chamber Temp SP");
	    if($chamberLights) {
	    $myPicture->myData->addPoints($chamberLights,"Chamber Lights");
	    };
	    if($chamberRH) {
	    $myPicture->myData->addPoints($chamberRH,"Chamber RH PV");
//	    $myPicture->myData->addPoints($chamberRHSP,"Chamber RH SP");
	    };
	};
    $myPicture->myData->addPoints($time,"Times");
    $myPicture->myData->setAbscissa("Times");
    $myPicture->myData->setXAxisDisplay(AXIS_FORMAT_TIME);
    $myPicture->myData->setPalette("Logger Temp",new pColor(255,0,0,255));//logger temp is red.
    $myPicture->myData->setPalette("Logger RH",new pColor(0,255,0,255));//logger RH is green.
    if($mac&&!empty($chamberData)) {
	    $myPicture->myData->setPalette("Chamber Temp PV",new pColor(0,255,255,255));//chamber temp pv is purple.
	    $myPicture->myData->setPalette("Chamber Temp SP",new pColor(0,0,255,255));//chamber temp sp is blue.
	    $myPicture->myData->setPalette("Chamber Lights",new pColor(205,205,0,255));//lights is yellow.
    };
    /*
    $seriesSettings=array("R"=>230,"G"=>0,"B"=>0,'Alpha'=>80);
    $myPicture->myData->setPalette("Ambient Temp",$seriesSettings);
    $seriesSettings=array("R"=>0,"G"=>0,"B"=>230,'Alpha'=>80);
    $myPicture->myData->setPalette("Ambient RH",$seriesSettings);
     */
    /* Create a pChart object and associate your dataset */ 
    //$myPicture = new pImage(1024,520,$myData);
    /* Choose a nice font */
    $myPicture->setFontProperties(array("FontName"=>"lib/fonts/Forgotte.ttf","FontSize"=>11));
    /* Define the boundaries of the graph area */
    $myPicture->setGraphArea(60,40,996,680);
    //$myPicture->drawText(350,40,"{$SONumber}, {$testType}, Temp And RH, {$name}",array("FontSize"=>10,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
    if(!$so) {
	    $so="Idle";
    };
    $myPicture->drawText(1050,40,"Logger $logger,$so",array("FontSize"=>10,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
    /* Draw guide lines */
    for($y=40;$y<680;$y=$y+5) {
	    $myPicture->drawLine(60,$y,996,$y,["Color"=>new pColor(0,200,200,40),"Ticks"=>0]);
    };
    for($y=60;$y<996;$y=$y+39) {
	    $myPicture->drawLine($y,40,$y,680,["Color"=>new pColor(0,200,200,40),"Ticks"=>0]);
    };
    $myPicture->drawLegend(1025,600);
	//Grab and display chart info 
	$minTime=min($time);
	$maxTime=max($time);
	$chartInfo=grabChartInfo($logger,gmdate("Y-m-d H:i:s",$minTime));
	$comments=$chartInfo["comments"];
	$tests=$chartInfo["tests"];
	$chambers=$chartInfo["chambers"];
	//Comments
	for($k=0;$k<sizeof($comments);$k++) {
		$x=((3600+strtotime($comments[$k][1])-$minTime)/($maxTime-$minTime)) * (996)+60;  //TODO:  Figure out what the hell is going on with this 3600 bullshit later.
		if($k%2==0) {
			$myPicture->drawLine($x,20,$x,680,["Color"=>new pColor(200,200,200,80)]);
			$myPicture->drawText($x,20,$comments[$k][0],array("FontSize"=>10,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
		} else {
			$myPicture->drawLine($x,30,$x,680,["Color"=>new pColor(200,200,200,80)]);
			$myPicture->drawText($x,30,$comments[$k][0],array("FontSize"=>10,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
		};
	};
	//Testing
	for($k=0;$k<sizeof($tests);$k++) {
		$x=((3600+strtotime($tests[$k][2])-$minTime)/($maxTime-$minTime)) * (996)+60; //TODO:  TIMEZONES AND DST
		if($k%2==1) {
			$myPicture->drawLine($x,20,$x,680,["Color"=>new pColor(200,200,200,80)]);
			if($tests[$k][0]==1) {
				$myPicture->drawText($x,20,"{$tests[$k][1]} started",array("FontSize"=>10,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
			} else {
				$myPicture->drawText($x,20,"{$tests[$k][1]} ended",array("FontSize"=>10,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
			};
		} else {
			$myPicture->drawLine($x,30,$x,680,["Color"=>new pColor(200,200,200,80)]);
			if($tests[$k][0]==1) {
				$myPicture->drawText($x,30,"{$tests[$k][1]} started",array("FontSize"=>10,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
			} else {
				$myPicture->drawText($x,30,"{$tests[$k][1]} ended",array("FontSize"=>10,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
			};
		};
	};
	//Chamber movement
	for($k=0;$k<sizeof($chambers);$k++) {
		$x=((3600+strtotime($chambers[$k][2])-$minTime)/($maxTime-$minTime)) * (996)+60;
		if($k%2==0) {
			$myPicture->drawLine($x,20,$x,680,["Color"=>new pColor(200,200,200,80)]);
			if($chambers[$k][0]==1) {
				$myPicture->drawText($x,20,"{$chambers[$k][1]} started",array("FontSize"=>10,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
			} else {
				$myPicture->drawText($x,20,"{$chambers[$k][1]} ended",array("FontSize"=>10,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
			};
		} else {
			$myPicture->drawLine($x,30,$x,680,["Color"=>new pColor(200,200,200,80)]);
			if($chambers[$k][0]==1) {
				$myPicture->drawText($x,30,"{$chambers[$k][1]} entered",array("FontSize"=>10,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
			} else {
				$myPicture->drawText($x,30,"{$chambers[$k][1]} left",array("FontSize"=>10,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE));
			};
		};
	};
	
    /*Set axis boundaries*/
    $axisBoundaries=array(0=>array("Min"=>-15,"Max"=>100));
    /* Draw the scale, keep everything automatic */ 
	//echo $n;
    $labelSkip=intval($n/30);
    $myPicture->drawScale(array("Mode"=>SCALE_MODE_MANUAL,"ManualScale"=>$axisBoundaries,"GridR"=>40,"GridG"=>40,"GridB"=>40,"LabelSkip"=>$labelSkip,"LabelRotation"=>45,"DrawSubTicks"=>TRUE,"DrawYLines"=>ALL,"CycleBackground"=>TRUE,"BackgroundColor2"=>new pColor(160,160,160,30)));
    /* Draw the scale, keep everything automatic */ 
    $pCharts= new pCharts($myPicture);
    $pCharts->drawSplineChart();
    /* Render the picture (choose the best way) */
    $myPicture->Render("TempAndRh.png");
}
function tagGet($ip,$name,$ch) {
	curl_setopt($ch, CURLOPT_URL, "http://{$ip}/read_data.xml?Cmd=read&Tag={$name}"); 
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
	$output = curl_exec($ch); 
	$output = preg_split($name);
	$output = substr($output[1],1,-2);
	return $output;
};
function chamberEntry($logger,$so) {
	$ch=curl_init();
	ob_end_flush();
	echo "Chamber Entry ","Entering into database.<BR>";
	ob_flush();
	flush();
	$db=new PDO("mysql:host=localhost;dbname=chambertestdata;port=3306;charset=utf8","root","");
	$time=time()-3600*6;
	$db->beginTransaction();
	$prep="INSERT INTO loggers(logger,unixTime) VALUES (?,?)";
	$stmt=$db->prepare($prep);
	$executionArray=["{$logger}",gmdate("Y-m-d H:i:s",$time)];
	$stmt->execute($executionArray);
	$prep="INSERT INTO chambers(logID,flagStartEndChamber,so,ip,mac) VALUES (LAST_INSERT_ID(),?,?,?,?)";
	$stmt=$db->prepare($prep);
	$executionArray=['1',"{$so}","0","0"];//"{$ip}","{$mac}"];
	$stmt->execute($executionArray);
	$db->commit();
	$db=null;
	curl_close($ch);
	return 0;
}
function commentEntry($logger,$note) {
	$db=new PDO("mysql:host=localhost;dbname=chambertestdata;port=3306;charset=utf8","root","");
	$time=time()-3600*6;
	$db->beginTransaction();
	$prep="INSERT INTO loggers(logger,unixTime) VALUES (?,?)";
	$stmt=$db->prepare($prep);
	$executionArray=["{$logger}",gmdate("Y-m-d H:i:s",$time)];
	$stmt->execute($executionArray);
	$prep="INSERT INTO comments(logID,note) VALUES (LAST_INSERT_ID(),?)";
	$stmt=$db->prepare($prep);
	$executionArray=[$note];
	$stmt->execute($executionArray);
	$db->commit();
	$db=null;
}
function testEntry($logger,$testType) {
	$db=new PDO("mysql:host=localhost;dbname=chambertestdata;port=3306;charset=utf8","root","");
	$time=time()-3600*6;
	$db->beginTransaction();
	$prep="SELECT chamberID FROM chambers INNER JOIN loggers ON chambers.logID=loggers.logID WHERE logger=? AND flagStartEndChamber=1 ORDER BY unixTime DESC LIMIT 1";
	$stmt=$db->prepare($prep);
	$executionArray=["{$logger}"];
	$stmt->execute($executionArray);
	$chamberID=$stmt->fetch();
	$prep="INSERT INTO loggers(logger,unixTime) VALUES (?,?)";
	$stmt=$db->prepare($prep);
	$executionArray=["{$logger}",gmdate("Y-m-d H:i:s",$time)];
	$stmt->execute($executionArray);
	$prep="INSERT INTO tests(chamberID,logID,flagStartEndTest,testType,testPass,signature) VALUES (?,LAST_INSERT_ID(),?,?,?,?)";
	$stmt=$db->prepare($prep);
	$executionArray=["{$chamberID[0]}","1","{$testType}",0,"COM"];
	$stmt->execute($executionArray);
	$db->commit();
	$db=null;
	curl_close($ch);
}
function testEnd($logger,$submissionFlag) {
	//Initial data.
	$lastChamberData=lastChamberStart($logger);
	$lastTestStart=lastTestStart($logger);
	$testType=$lastTestStart[1];
	$so=$lastChamberData[1];
	$ip=$lastChamberData[2];
	$mac=str_replace(":","",$lastChamberData[3]);
	//Update database.
	$db=new PDO("mysql:host=localhost;dbname=chambertestdata;port=3306;charset=utf8","root","");
	$time=time()-3600*6;
	$db->beginTransaction();
	$prep="SELECT chamberID FROM chambers INNER JOIN loggers ON chambers.logID=loggers.logID WHERE logger=? AND flagStartEndChamber=1 ORDER BY unixTime DESC LIMIT 1";
	$stmt=$db->prepare($prep);
	$executionArray=["{$logger}"];
	$stmt->execute($executionArray);
	$chamberID=$stmt->fetch();
	$prep="INSERT INTO loggers(logger,unixTime) VALUES (?,?)";
	$stmt=$db->prepare($prep);
	$executionArray=["{$logger}",gmdate("Y-m-d H:i:s",$time)];
	$stmt->execute($executionArray);
	$prep="INSERT INTO tests(chamberID,logID,flagStartEndTest,testType,testPass,signature) VALUES (?,LAST_INSERT_ID(),?,?,?,?)";
	$stmt=$db->prepare($prep);
	$executionArray=["{$chamberID[0]}","0","{$testType}",0,"COM"];
	$stmt->execute($executionArray);
	$db->commit();
	$db=null;

	//Save to file.
	$timestamp=strtotime(lastTestEnd($logger));
	$zoomLevel=max(60,60*intval(($timestamp-strtotime($lastTestStart[0]))/3600));
	$lastChamberData=lastChamberStart($logger);
	if($lastChamberData[0]<lastChamberEnd($logger)) {
		createChart($logger,$zoomLevel,'','');
	} else {
		createChart($logger,$zoomLevel,$so,'');
	};
	copy("TempAndRH.png","\\\\SRVFILEPERC\Departments\Engineering\Data\ChamberQualityControlData\\"."$so"."_$testType"."_$logger"."_$timestamp"."_TempAndRH.png");
	//Send out e-mail if necessary.
	if($submissionFlag) {
		$transport = Swift_SmtpTransport::newInstance('10.1.1.119', 25);
		//$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, "ssl")
		//	->setUsername('percival.connect@gmail.com')
		//	->setPassword('t8Bl3t8pp');
		$mailer = Swift_Mailer::newInstance($transport);
		if($testType=='recalib') {
			$message = Swift_Message::newInstance('TESTING UPDATE')
			  ->setFrom(array('testing@percival-scientific.com' => 'TESTING'))
			  ->setTo(array('dimberti@percival-scientific.com','khuffman@percival-scientific.com'))
			  ->setBody("Attached are calibration charts for logger recalibration.");
//			  ->attach(Swift_Attachment::fromPath('Temp.png')->setFilename('Temp.png'));
//			$message->attach(Swift_Attachment::fromPath('RH.png')->setFilename('RH.png'));
			$message->attach(Swift_Attachment::fromPath('TempAndRh.png')->setFilename('TempAndRh.png'));
		} else {
			$message = Swift_Message::newInstance('TESTING UPDATE')
			  ->setFrom(array('testing@percival-scientific.com' => 'TESTING'))
			  ->setTo(array('dimberti@percival-scientific.com','jsmith@percival-scientific.com','rnelson@percival-scientific.com','dduncan@percival-scientific.com','SGould@percival-scientific.com','testing@percival-scientific.com'))
			  //->setTo(array('dimberti@percival-scientific.com'))
			  ->setBody("Finished {$testType} test on chamber {$so}.  Chart is attached.");
//			  ->attach(Swift_Attachment::fromPath('Temp.png')->setFilename('Temp.png'));
//			$message->attach(Swift_Attachment::fromPath('RH.png')->setFilename('RH.png'));
			$message->attach(Swift_Attachment::fromPath('TempAndRh.png')->setFilename('TempAndRh.png'));
		};
		$result = $mailer->send($message);

	};
}
function applyDayOffset($logger) {
	$lastChamberData=lastChamberStart($logger);
	$so=$lastChamberData[1];
	$ip=$lastChamberData[2];
	$mac=str_replace(":","",$lastChamberData[3]);
	$loggerData=grabMongo($logger,30,1);
	$chamberData=grabMongoChamber("Chamber ".$mac,30,1);
	$loggerTemp=$loggerData["PV1Values"];
	$loggerRH=$loggerData["PV2Values"];
	$loggerPV=$loggerTemp[0];
	$loggerPV2=$loggerRH[0];
	$chamberTemp=$chamberData["PV1Values"];
	$chamberRH=$chamberData["PV2Values"];
	$chamberPV=$chamberTemp[0];
	$offset=$loggerPV-$chamberPV;
	$ch=curl_init();
	if($chamberRH) {
		$offsetRH=$loggerPV2-$chamberRH[0];
		$url=$ip."/read_data.xml?Cmd=write&AI_Offset_1_Day=".$offset."&AI_Offset_Limit2_Day=".$offset."&AI_Offset_2_Day=".$offsetRH;
	} else {
		$url=$ip."/read_data.xml?Cmd=write&AI_Offset_1_Day=".$offset."&AI_Offset_Limit2_Day=".$offset;
	};
	curl_setopt($ch,CURLOPT_URL,$url);
	curl_setopt($ch,CURLOPT_RETURNTRANSFER,FALSE);
	curl_setopt($ch,CURLOPT_HEADER,0);
	curl_setopt($ch,CURLOPT_TIMEOUT,10);
	curl_setopt($ch,CURLOPT_NOBODY,1);
	curl_exec($ch);
	curl_close($ch);
	return 0;
}
function applyNightOffset($logger) {
	$lastChamberData=lastChamberStart($logger);
	$so=$lastChamberData[1];
	$ip=$lastChamberData[2];
	$mac=str_replace(":","",$lastChamberData[3]);
	$loggerData=grabMongo($logger,30,1);
	$chamberData=grabMongoChamber("Chamber ".$mac,30,1);
	$loggerTemp=$loggerData["PV1Values"];
	$loggerRH=$loggerData["PV2Values"];
	$loggerPV=$loggerTemp[0];
	$loggerPV2=$loggerRH[0];
	$chamberTemp=$chamberData["PV1Values"];
	$chamberRH=$chamberData["PV2Values"];
	$chamberPV=$chamberTemp[0];
	$offset=($loggerPV-$chamberPV);
	$ch=curl_init();
	if($chamberRH) {
		$offsetRH=$loggerPV2-$chamberRH[0];
		$url=$ip."/read_data.xml?Cmd=write&AI_Offset_1_Night=".$offset."&AI_Offset_Limit2_Night=".$offset."&AI_Offset_2_Night=".$offsetRH;
	} else {
		$url=$ip."/read_data.xml?Cmd=write&AI_Offset_1_Night=".$offset."AI_Offset_Limit2_Night=".$offset;
	};
	curl_setopt($ch,CURLOPT_URL,$url);
	curl_setopt($ch,CURLOPT_RETURNTRANSFER,FALSE);
	curl_setopt($ch,CURLOPT_HEADER,0);
	curl_setopt($ch,CURLOPT_TIMEOUT,10);
	curl_setopt($ch,CURLOPT_NOBODY,1);
	curl_exec($ch);
	curl_close($ch);
	return 0;
}

function chamberRemoval($logger) {
	$ch=curl_init();
	ob_end_flush();
	//Grab data
	echo "Chamber Removal ","Grabbing data...<BR>";
	ob_flush();
	flush();
	$lastChamberData=lastChamberStart($logger);
	$so=$lastChamberData[1];
	$mac=str_replace(":","",$lastChamberData[3]);
	$timestamp=time()-6*3600;
	$zoomLevel=max(60,60*intval(($timestamp-strtotime($lastChamberData[0]))/3600));
	//Grab logger data.
	$loggerData=grabMongo($logger,$zoomLevel,1);
	$n=sizeof($loggerData["PV1Values"]);
	$loggerTemperature=array($n);
	$loggerRH=array($n);
	foreach($loggerData["PV1Values"] as $key=>$value) { $loggerTemperature[$key]=floatval($value/1000);};
	foreach($loggerData["PV2Values"] as $key=>$value) { $loggerRH[$key]=floatval($value/1000);};
	foreach($loggerData["timeValues"] as $key=>$value) { $time[$key]=$value-6*3600;};
	$time=array_reverse($time);//ambientData["timeValues"]);
	//Grab ambient data.
	$ambientData=grabMongo('A1',$zoomLevel,1);
	$m=sizeof($loggerData["PV1Values"]);
	$ambientTemperature=array($n);
	$ambientRH=array($n);
	foreach($ambientData["PV1Values"] as $key=>$value) { $ambientTemperature[$key]=floatval($value/1000);};
	foreach($ambientData["PV2Values"] as $key=>$value) { $ambientRH[$key]=floatval($value/1000);};
	foreach($ambientData["timeValues"] as $key=>$value) { $time[$key]=$value-6*3600;};
	$n=max($m,$n);
	$ambientTemperature=array_pad($ambientTemperature,$n,0);
	$loggerTemperature=array_pad($loggerTemperature,$n,0);
	$ambientRH=array_pad($ambientRH,$n,0);
	$loggerRH=array_pad($loggerRH,$n,0);
	$loggerTemperature=array_reverse($loggerTemperature);
	$loggerRH=array_reverse($loggerRH);
	$ambientTemperature=array_reverse($ambientTemperature);
	$ambientRH=array_reverse($ambientRH);
	//Grab chamber data, if applicable.
	if($mac) {
		$chamberData=grabMongoChamber("Chamber ".$mac,$zoomLevel,1);
		foreach($chamberData["PV1Values"] as $key=>$value) { $chamberTemperature[$key]=floatval($value/1000);};
		$chamberTemperature=array_pad($chamberTemperature,$n,0);
		$chamberTemperature=array_reverse($chamberTemperature);
		$chamberRH[0]=0;
		foreach($chamberData["PV2Values"] as $key=>$value) { $chamberRH[$key]=floatval($value/1000);};
		$chamberRH=array_pad($chamberRH,$n,0);
		$chamberRH=array_reverse($chamberRH);
		foreach($chamberData["SP1Values"] as $key=>$value) { $chamberTemperatureSP[$key]=floatval($value/1000);};
		$chamberTemperatureSP=array_pad($chamberTemperatureSP,$n,0);
		$chamberTemperatureSP=array_reverse($chamberTemperatureSP);
//		foreach($chamberData["SP2Values"] as $key=>$value) { $chamberRHSP[$key]=floatval($value/1000);};
//		$chamberRHSP=array_pad($chamberRHSP,$n,0);
//		$chamberRHSP=array_reverse($chamberRHSP);
		foreach($chamberData["EO1Values"] as $key=>$value) { $chamberLights[$key]=floatval($value/1000);};
		$chamberLights=array_pad($chamberLights,$n,0);
		$chamberLights=array_reverse($chamberLights);
	};
	//Save data to database.
	echo "Chamber Removal ","Saving to database and removing database flag...<BR>";
	ob_flush();
	flush();
	$db=new PDO("mysql:host=localhost;dbname=chambertestdata;port=3306;charset=utf8","root","");
	$db->beginTransaction();
	for($i=0;$i<$n;$i++) {
		$prep="INSERT INTO loggers(logger,unixTime) VALUES (?,?)";
		$stmt=$db->prepare($prep);
		$executionArray=["{$logger}",gmdate("Y-m-d H:i:s",$time[$i])];
		$stmt->execute($executionArray);
		$prep="INSERT INTO data(logID,tempPV,RHPV,tempSP,RHSP,lights,tempAmbient,RHAmbient,tempLogger,RHLogger) VALUES (LAST_INSERT_ID(),?,?,?,?,?,?,?,?,?)";
		$stmt=$db->prepare($prep);
		if(!$chamberTemperature[$i]) { $chamberTemperature[$i]=0;$chamberTemperatureSP[$i]=0;};
		if(!$chamberRH[$i]) { $chamberRH[$i]=0;$chamberRHSP[$i]=0;};
		if(!$chamberLights[$i]) { $chamberLights[$i]=0;};
		$executionArray=[floatval($chamberTemperature[$i]),floatval($chamberRH[$i]),floatval($chamberTemperatureSP[$i]),floatval($chamberRHSP[$i]),intval($chamberLights[$i]),floatval($ambientTemperature[$i]),floatval($ambientRH[$i]),floatval($loggerTemperature[$i]),floatval($loggerRH[$i])];
		$stmt->execute($executionArray);
	};
	//Note chamber removal.
	$prep="INSERT INTO loggers(logger,unixTime) VALUES (?,?)";
	$stmt=$db->prepare($prep);
	$time=time()-3600*6;
	$executionArray=["{$logger}",gmdate("Y-m-d H:i:s",$time)];
	$stmt->execute($executionArray);
	$prep="INSERT INTO chambers(logID,flagStartEndChamber,so,ip,mac) VALUES (LAST_INSERT_ID(),?,?,?,?)";
	$stmt=$db->prepare($prep);
	$executionArray=['0',"{$lastChamberData[1]}","{$lastChamberData[2]}","{$lastChamberData[3]}"];
	$stmt->execute($executionArray);
	$db->commit();
	$db=null;
	$ip=$lastChamberData[2];
	//TODO:  Duplicate config file from POrders to database.
	ob_flush();
	flush();
	echo "Chamber Removal ","Completed!<BR>";
	curl_close($ch);
	$db=null;
	return 0;
}

function loggerIPLookup($logger) {
	if($logger=="A1") {
		return "10.2.0.5";
	} elseif($logger="A2") {
		return "10.2.0.6";
	} elseif($logger="A3") {
		return "10.2.0.7";
	} elseif($logger="A4") {
		return "10.2.0.8";
	} elseif($logger="B1A") {
		return "10.2.0.15";
	} elseif($logger="B2") {
		return "10.2.0.16";
	} elseif($logger="B3") {
		return "10.2.0.17";
	} elseif($logger="B4") {
		return "10.2.0.18";
	} elseif($logger="C1") {
		return "10.2.0.25";
	} elseif($logger="C2") {
		return "10.2.0.26";
	} elseif($logger="C3") {
		return "10.2.0.27";
	} elseif($logger="C4") {
		return "10.2.0.28";
	} elseif($logger="D1") {
		return "10.2.0.35";
	} elseif($logger="D2") {
		return "10.2.0.36";
	} elseif($logger="D3") {
		return "10.2.0.37";
	} elseif($logger="D4") {
		return "10.2.0.48";
	} elseif($logger="E1") {
		return "10.2.0.55";
	} elseif($logger="E2") {
		return "10.2.0.56";
	} elseif($logger="E3") {
		return "10.2.0.57";
	} elseif($logger="E4") {
		return "10.2.0.58";
	} elseif($logger="F1") {
		return "10.2.0.65";
	} elseif($logger="F2") {
		return "10.2.0.66";
	} elseif($logger="F3") {
		return "10.2.0.67";
	} elseif($logger="F4") {
		return "10.2.0.68";
	} elseif($logger="G1") {
		return "10.2.0.75";
	} elseif($logger="G2") {
		return "10.2.0.76";
	} elseif($logger="G3") {
		return "10.2.0.77";
	} elseif($logger="G4") {
		return "10.2.0.78";
	} else {
		return "10.2.0.0";
	};
}
function alarmCheck($ip) {
	$ch=curl_init();
	$url=$ip."/alarm_status.xml?Cmd=read&Item=menu";
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
	$output = str_replace('Off','',str_replace('readmenu','',strip_tags(curl_exec($ch))));
	if($output) {
		return "1";
	} else {
		return "0";
	};
	curl_close($ch);
};
function checkFlatness($logger) {
	//Checks whether past 30 minutes of logger data has reached a steady state or not.
	$loggerData=grabMongo($logger,30,0);
	$range=max(array_slice($loggerData["PV1Values"],0,30))-min(array_slice($loggerData["PV1Values"],0,30));
	if($range<900) {
		return 1;
	} else {
		return 0;
	};
};
?>
