From 20716ce92f24b2e4d49f9c0d8ed56ff0ec384677 Mon Sep 17 00:00:00 2001
From: deadlocker8 <deadlocker@gmx.de>
Date: Sun, 31 Jul 2016 14:41:06 +0200
Subject: [PATCH] fixed #11

---
 css/style.css     |   4 +
 php/error.php     |  56 ++++
 php/index.php     | 664 ++++++++++++++++++++++++----------------------
 php/language.json |   8 +-
 4 files changed, 417 insertions(+), 315 deletions(-)
 create mode 100644 php/error.php

diff --git a/css/style.css b/css/style.css
index 640dd41..7795a0b 100644
--- a/css/style.css
+++ b/css/style.css
@@ -35,6 +35,10 @@
 	margin-top: 20px !important;;
 }
 
+.margin-top-huge{
+	margin-top: 10rem !important;;
+}
+
 .margin-bottom{
 	margin-bottom: 20px !important;
 }
diff --git a/php/error.php b/php/error.php
new file mode 100644
index 0000000..630f6d6
--- /dev/null
+++ b/php/error.php
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+
+<?php
+include_once('getLanguageJSON.php');
+?>
+<html xmlns="http://www.w3.org/1999/html">
+	<head>
+		<meta charset="UTF-8"/>
+		<title>Roadmap</title>
+		<!--Import Google Icon Font-->
+		<link href="http://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
+		<!--Import materialize.css-->
+		<link type="text/css" rel="stylesheet" href="../materialize/css/materialize.min.css" media="screen,projection"/>
+		<link type="text/css" rel="stylesheet" href="../css/style.css"/>
+
+		<!--Import jQuery before materialize.js-->
+		<script type="text/javascript" src="../js/jquery-2.2.4.min.js"></script>
+		<script type="text/javascript" src="../materialize/js/materialize.min.js"></script>
+		<script type="text/javascript" src="../js/main.js"></script>
+		<script type="text/javascript" src="../js/ResizeSensor.js"></script>
+		<script type="text/javascript" src="../js/ElementQueries.js"></script>
+
+		<!--Let browser know website is optimized for mobile-->
+		<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+	</head>
+
+	<body class="grey lighten-3">
+		<main>
+			<div class="container">
+				<div class="row">
+					<div class="s6 offset-s3 center-align margin-top-huge">
+						<h5>
+							<?php
+								if(isset($_GET['message']))
+								{
+									if($languageJSON->{$_GET['message']})
+									{
+										echo $languageJSON->{$_GET['message']};
+									}
+									else
+									{
+										echo $languageJSON->error_general;
+									}
+								}
+								else
+								{
+									echo $languageJSON->error_general;
+								}
+							?>
+						</h5>
+					</div>
+				</div>
+			</div>
+		</main>
+	</body>
+</html>
\ No newline at end of file
diff --git a/php/index.php b/php/index.php
index 994258c..84a4658 100644
--- a/php/index.php
+++ b/php/index.php
@@ -6,15 +6,15 @@ include_once('mysql.php');
 
 if(!isset($_GET['id']))
 {
-	//TODO
-	die("get param missing");
+	header('Location: error.php?message=error_param_missing');
+	exit;
 }
 
 $ID = $_GET['id'];
 if(!is_numeric($ID) || $ID < 1)
 {
-	//TODO
-	die("param is not numeric or less than 1");
+	header('Location: error.php?message=error_param_invalid');
+	exit;
 }
 
 $db = new DB();
@@ -23,16 +23,16 @@ $db->createTables();
 $projectName = $db->getRoadmap($ID);
 if($projectName == false)
 {
-	//TODO
-	die("no roadmap with this ID existing");
+	header('Location: error.php?message=error_roadmap_not_existing');
+	exit;
 }
 $projectName = $projectName["Projectname"];
 
 $milestones = $db->getMilestones($ID);
 if($milestones == false)
 {
-	//TODO
-	die("no milestones for this roadmap");
+	header('Location: error.php?message=error_no_milestones');
+	exit;
 }
 
 $numberOfMilestones = sizeof($milestones);
@@ -40,8 +40,8 @@ $numberOfMilestones = sizeof($milestones);
 $numberofOpenMilestones = $db->getNumberOfOpenMilestones($ID);
 if($numberofOpenMilestones == false)
 {
-	//TODO
-	die("error getting open milestones");
+	header('Location: error.php?message=error_database_connection');
+	exit;
 }
 
 $numberofOpenMilestones = $numberofOpenMilestones['count'];
@@ -77,48 +77,12 @@ $numberofOpenMilestones = $numberofOpenMilestones['count'];
 							<div class="col s1 m2 l2 offset-m1 offset-l1 no-padding">
 								<div class="hide-on-small-only trainmap">
 									<?php
-										for($i = 0; $i < $numberofOpenMilestones; $i++)
-										{
-											echo '<div class="train-circle train-circle-light"></div>';
-
-											if($numberofOpenMilestones != $numberOfMilestones || $i != ($numberofOpenMilestones-1))
-											{
-												echo '<div class="train-line dotted"></div>';
-											}
-										}
-
-										for($i = 0; $i < ($numberOfMilestones - $numberofOpenMilestones); $i++)
-										{
-											echo '<div class="train-circle blue"></div>';
-
-											if($i !=  (($numberOfMilestones - $numberofOpenMilestones) - 1))
-											{
-												echo '<div class="train-line"></div>';
-											}
-										}
+										createTrainmapMedAndUp($numberofOpenMilestones, $numberOfMilestones);
 									?>
 								</div>
 								<div class="hide-on-med-and-up trainmap-small">
 									<?php
-										for($i = 0; $i < $numberofOpenMilestones; $i++)
-										{
-											echo '<div class="train-circle train-circle-light train-circle-small"></div>';
-
-											if($numberofOpenMilestones != $numberOfMilestones || $i != ($numberofOpenMilestones-1))
-											{
-												echo '<div class="train-line dotted-small train-line-small"></div>';
-											}
-										}
-
-										for($i = 0; $i < ($numberOfMilestones - $numberofOpenMilestones); $i++)
-										{
-											echo '<div class="train-circle blue train-circle-small"></div>';
-
-											if($i !=  (($numberOfMilestones - $numberofOpenMilestones) - 1))
-											{
-												echo '<div class="train-line train-line-small"></div>';
-											}
-										}
+										createTrainmapSmall($numberofOpenMilestones, $numberOfMilestones);
 									?>
 								</div>
 							</div>
@@ -149,159 +113,11 @@ $numberofOpenMilestones = $numberofOpenMilestones['count'];
 										$tasks = $db->getTasks($currentMilestone['ID']);
 										if($tasks == false)
 										{
-											echo '<div class="card padding white milestone">' .
-												'<div class="card-content">' .
-												'<div class="'.$color.' center-align milestone-title">' .
-												'<span class="card-title bold padding-left-and-right truncate">' . $currentMilestone['VersionName'] . ' - ' . $currentMilestone['Title'] . '</span>' .
-												'</div>' .
-												'<div class="milestone-content margin-top">' .
-												'<div class="white progress-container">'.
-												'<div class="progress grey lighten-2 high-progress margin-bottom">'.
-												'<div class="determinate green" style="width: 0%"></div>'.
-												'</div>'.
-												'</div>'.
-												'<div class="row">' .
-												'<div class="col s6 valign-wrapper">' .
-												'<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->due_by . ' ' . $dueDate . '</span>' .
-												'</div>' .
-												'<div class="col s6 valign-wrapper">' .
-												'<i class="material-icons valign">event</i><span class="valign margin-left">0% ' . $languageJSON->done . '</span>' .
-												'</div>' .
-												'</div>' .
-												'</div>' .
-												'</div>' .
-												'</div>';
+											printMilestoneIndevAndNoTasks($color, $currentMilestone, $dueDate, $languageJSON);
 										}
 										else
 										{
-											$dueDate = $currentMilestone['DueDate'];
-											if($dueDate == "2000-01-01")
-											{
-												$dueDate = "-";
-											}
-											else
-											{
-												$dueDate = date_create($dueDate);
-												$dueDate = date_format($dueDate, "d.m.Y");
-											}
-
-											$completionDate = $currentMilestone['CompletionDate'];
-											$completionDate = date_create($completionDate);
-											$completionDate = date_format($completionDate, "d.m.Y");
-
-											$numberOfOpenTasks = $db->getNumberOfOpenTasks($currentMilestone['ID']);
-											if($numberOfOpenTasks == false)
-											{
-												//TODO
-											}
-											else
-											{
-												$numberOfOpenTasks = $numberOfOpenTasks['count'];
-												$percentage = ($numberOfOpenTasks / sizeof($tasks))*100;
-												$percentage = round($percentage);
-
-												echo '<div class="card padding white milestone">' .
-													'<div class="card-content">' .
-													'<div class="'.$color.' center-align milestone-title">' .
-													'<span class="card-title bold padding-left-and-right truncate">' . $currentMilestone['VersionName'] . ' - ' . $currentMilestone['Title'] . '</span>' .
-													'</div>' .
-													'<div class="milestone-content margin-top">' .
-													'<div class="white progress-container">'.
-													'<div class="progress grey lighten-2 high-progress margin-bottom">'.
-													'<div class="determinate green" style="width: '.$percentage.'%"></div>'.
-													'</div>'.
-													'</div>'.
-													'<div class="row">' .
-													'<div class="col s6 valign-wrapper">' .
-													'<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->due_by . ' ' . $dueDate . '</span>' .
-													'</div>' .
-													'<div class="col s6 valign-wrapper">' .
-													'<i class="material-icons valign">event</i><span class="valign margin-left">'.$percentage.'% ' . $languageJSON->done .'</span>' .
-													'</div>' .
-													'</div>' .
-													'<ul class="collapsible white" data-collapsible="accordion">';
-												for($k = 0; $k < sizeof($tasks); $k++)
-												{
-													$currentTask = $tasks[$k];
-
-													$subtasks = $db->getSubtasks($currentTask['ID']);
-													if($subtasks == false)
-													{
-														//inDev
-														if($currentTask['Status'] == 0)
-														{
-															echo '<li>' .
-																'<div class="collapsible-header bold"><i class="material-icons red-text">build</i>' . $currentTask['Title'] . '</div>' .
-																'<div class="collapsible-body"><p>' . $currentTask['Description'] . '</p></div>' .
-																'</li>';
-														}
-														//done
-														else
-														{
-															echo '<li>' .
-																'<div class="collapsible-header bold"><i class="material-icons green-text">check</i>' . $currentTask['Title'] . '</div>' .
-																'<div class="collapsible-body"><p>' . $currentTask['Description'] . '</p></div>' .
-																'</li>';
-														}
-													}
-													else
-													{
-														$numberOfOpenSubtasks = $db->getNumberOfOpenSubtasks($currentTask['ID']);
-														if($numberOfOpenSubtasks == false)
-														{
-															//TODO
-														}
-														else
-														{
-															$numberOfOpenSubtasks = $numberOfOpenSubtasks['count'];
-															if($numberOfOpenSubtasks == sizeof($subtasks))
-															{
-																echo '<li>' .
-																	'<div class="collapsible-header bold"><i class="material-icons green-text">check</i>Layout<span class="right">' . $numberOfOpenSubtasks . '/' . sizeof($subtasks) . '</span></div>' .
-																	'<div class="collapsible-body">' .
-																	'<ul class="collapsible white margin-left-and-right no-shadow margin-top-and-bottom" data-collapsible="accordion">';
-															}
-															else
-															{
-																echo '<li>' .
-																	'<div class="collapsible-header bold"><i class="material-icons red-text">build</i>Layout<span class="right">' . $numberOfOpenSubtasks . '/' . sizeof($subtasks) . '</span></div>' .
-																	'<div class="collapsible-body">' .
-																	'<ul class="collapsible white margin-left-and-right no-shadow margin-top-and-bottom" data-collapsible="accordion">';
-															}
-
-															for($m = 0; $m < sizeof($subtasks); $m++)
-															{
-																$currentSubTask = $subtasks[$m];
-																//inDev
-																if($currentSubTask['Status'] == 0)
-																{
-																	echo '<li>' .
-																		'<div class="collapsible-header bold"><span class="left">' . ($m + 1) . '</span><i class="material-icons red-text margin-left">build</i>' . $currentSubTask['Title'] . '</div>' .
-																		'<div class="collapsible-body"><p>' . $currentSubTask['Description'] . '</p></div>' .
-																		'</li>';
-																}
-																//done
-																else
-																{
-																	echo '<li>' .
-																		'<div class="collapsible-header bold"><span class="left">' . ($m + 1) . '</span><i class="material-icons green-text margin-left">check</i>' . $currentSubTask['Title'] . '</div>' .
-																		'<div class="collapsible-body"><p>' . $currentSubTask['Description'] . '</p></div>' .
-																		'</li>';
-																}
-															}
-
-															echo '</ul>' .
-																'</div>' .
-																'</li>';
-														}
-													}
-												}
-
-												echo '</ul>' .
-													'</div>' .
-													'</div>' .
-													'</div>';
-											}
+											printMilestoneIndevWithTasks($currentMilestone, $db, $tasks, $color, $languageJSON);
 										}
 									}
 									//Milestone is done
@@ -334,124 +150,11 @@ $numberofOpenMilestones = $numberofOpenMilestones['count'];
 										$tasks = $db->getTasks($currentMilestone['ID']);
 										if($tasks == false)
 										{
-											echo '<div class="card padding white milestone">' .
-												'<div class="card-content">' .
-												'<div class="'.$color.' center-align milestone-title">' .
-												'<span class="card-title bold padding-left-and-right truncate">' . $currentMilestone['VersionName'] . ' - ' . $currentMilestone['Title'] . '</span>' .
-												'</div>';
-
-												if($isFirstMilestone)
-												{
-													echo '<div class="milestone-content margin-top init-as-expanded">';
-												}
-												else
-												{
-													echo '<div class="milestone-content margin-top">';
-												}
-
-												echo '<div class="row">' .
-												'<div class="col s6 valign-wrapper">' .
-												'<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->due_by . ' ' . $dueDate . '</span>' .
-												'</div>' .
-												'<div class="col s6 valign-wrapper">' .
-												'<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->done_at . ' ' . $completionDate . '</span>' .
-												'</div>' .
-												'</div>' .
-												'</div>' .
-												'</div>' .
-												'</div>';
+											printMilestoneDoneAndNoTasks($color, $currentMilestone, $isFirstMilestone, $languageJSON, $dueDate, $completionDate);
 										}
 										else
 										{
-											echo '<div class="card padding white milestone">' .
-												'<div class="card-content">' .
-												'<div class="'.$color.' center-align milestone-title">' .
-												'<span class="card-title bold padding-left-and-right truncate">' . $currentMilestone['VersionName'] . ' - ' . $currentMilestone['Title'] . '</span>' .
-												'</div>';
-
-												if($isFirstMilestone)
-												{
-													echo '<div class="milestone-content margin-top init-as-expanded">';
-												}
-												else
-												{
-													echo '<div class="milestone-content margin-top">';
-												}
-
-											echo '<div class="row">' .
-												'<div class="col s6 valign-wrapper">' .
-												'<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->due_by . ' ' . $dueDate . '</span>' .
-												'</div>' .
-												'<div class="col s6 valign-wrapper">' .
-												'<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->done_at . ' ' . $completionDate . '</span>' .
-												'</div>' .
-												'</div>' .
-												'<ul class="collapsible white" data-collapsible="accordion">';
-											for($k = 0; $k < sizeof($tasks); $k++)
-											{
-												$currentTask = $tasks[$k];
-
-												$subtasks = $db->getSubtasks($currentTask['ID']);
-												if($subtasks == false)
-												{
-													echo '<li>' .
-														'<div class="collapsible-header bold"><i class="material-icons green-text">check</i>' . $currentTask['Title'] . '</div>' .
-														'<div class="collapsible-body"><p>' . $currentTask['Description'] . '</p></div>' .
-														'</li>';
-												}
-												else
-												{
-													$numberOfOpenSubtasks = $db->getNumberOfOpenSubtasks($currentTask['ID']);
-													if($numberOfOpenSubtasks != false)
-													{
-														$numberOfOpenSubtasks = $numberOfOpenSubtasks['count'];
-														if($numberOfOpenSubtasks == sizeof($subtasks))
-														{
-															echo '<li>' .
-																'<div class="collapsible-header bold"><i class="material-icons green-text">check</i>Layout<span class="right">' . $numberOfOpenSubtasks . '/' . sizeof($subtasks) . '</span></div>' .
-																'<div class="collapsible-body">' .
-																'<ul class="collapsible white margin-left-and-right no-shadow margin-top-and-bottom" data-collapsible="accordion">';
-														}
-														else
-														{
-															echo '<li>' .
-																'<div class="collapsible-header bold"><i class="material-icons red-text">build</i>Layout<span class="right">' . $numberOfOpenSubtasks . '/' . sizeof($subtasks) . '</span></div>' .
-																'<div class="collapsible-body">' .
-																'<ul class="collapsible white margin-left-and-right no-shadow margin-top-and-bottom" data-collapsible="accordion">';
-														}
-
-														for($m = 0; $m < sizeof($subtasks); $m++)
-														{
-															$currentSubTask = $subtasks[$m];
-															//inDev
-															if($currentSubTask['Status'] == 0)
-															{
-																echo '<li>' .
-																	'<div class="collapsible-header bold"><span class="left">' . ($m + 1) . '</span><i class="material-icons red-text margin-left">build</i>' . $currentSubTask['Title'] . '</div>' .
-																	'<div class="collapsible-body"><p>' . $currentSubTask['Description'] . '</p></div>' .
-																	'</li>';
-															}
-															//done
-															else
-															{
-																echo '<li>' .
-																	'<div class="collapsible-header bold"><span class="left">' . ($m + 1) . '</span><i class="material-icons green-text margin-left">check</i>' . $currentSubTask['Title'] . '</div>' .
-																	'<div class="collapsible-body"><p>' . $currentSubTask['Description'] . '</p></div>' .
-																	'</li>';
-															}
-														}
-
-														echo '</ul>' .
-															'</div>' .
-															'</li>';
-													}
-												}
-											}
-
-											echo '</ul>' .
-												'</div>' .
-												'</div>' .
-												'</div>';
+											printMilestoneDoneWithTasks($color, $currentMilestone, $isFirstMilestone, $languageJSON, $dueDate, $completionDate, $tasks, $db);
 										}
 
 										if($isFirstMilestone)
@@ -467,4 +170,337 @@ $numberofOpenMilestones = $numberofOpenMilestones['count'];
 			</div>
 		</div>
 	</body>
-</html>
\ No newline at end of file
+</html>
+
+
+
+<?php
+function createTrainmapMedAndUp($numberofOpenMilestones, $numberOfMilestones)
+{
+	for($i = 0; $i < $numberofOpenMilestones; $i++)
+	{
+		echo '<div class="train-circle train-circle-light"></div>';
+
+		if($numberofOpenMilestones != $numberOfMilestones || $i != ($numberofOpenMilestones-1))
+		{
+			echo '<div class="train-line dotted"></div>';
+		}
+	}
+
+	for($i = 0; $i < ($numberOfMilestones - $numberofOpenMilestones); $i++)
+	{
+		echo '<div class="train-circle blue"></div>';
+
+		if($i !=  (($numberOfMilestones - $numberofOpenMilestones) - 1))
+		{
+			echo '<div class="train-line"></div>';
+		}
+	}
+}
+
+function createTrainmapSmall($numberofOpenMilestones, $numberOfMilestones)
+{
+	for($i = 0; $i < $numberofOpenMilestones; $i++)
+	{
+		echo '<div class="train-circle train-circle-light train-circle-small"></div>';
+
+		if($numberofOpenMilestones != $numberOfMilestones || $i != ($numberofOpenMilestones-1))
+		{
+			echo '<div class="train-line dotted-small train-line-small"></div>';
+		}
+	}
+
+	for($i = 0; $i < ($numberOfMilestones - $numberofOpenMilestones); $i++)
+	{
+		echo '<div class="train-circle blue train-circle-small"></div>';
+
+		if($i !=  (($numberOfMilestones - $numberofOpenMilestones) - 1))
+		{
+			echo '<div class="train-line train-line-small"></div>';
+		}
+	}
+}
+
+function printMilestoneIndevAndNoTasks($color, $currentMilestone, $dueDate, $languageJSON)
+{
+	echo '<div class="card padding white milestone">' .
+		'<div class="card-content">' .
+		'<div class="'.$color.' center-align milestone-title">' .
+		'<span class="card-title bold padding-left-and-right truncate">' . $currentMilestone['VersionName'] . ' - ' . $currentMilestone['Title'] . '</span>' .
+		'</div>' .
+		'<div class="milestone-content margin-top">' .
+		'<div class="white progress-container">'.
+		'<div class="progress grey lighten-2 high-progress margin-bottom">'.
+		'<div class="determinate green" style="width: 0%"></div>'.
+		'</div>'.
+		'</div>'.
+		'<div class="row">' .
+		'<div class="col s6 valign-wrapper">' .
+		'<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->due_by . ' ' . $dueDate . '</span>' .
+		'</div>' .
+		'<div class="col s6 valign-wrapper">' .
+		'<i class="material-icons valign">event</i><span class="valign margin-left">0% ' . $languageJSON->done . '</span>' .
+		'</div>' .
+		'</div>' .
+		'</div>' .
+		'</div>' .
+		'</div>';
+}
+
+function printMilestoneIndevWithTasks($currentMilestone, $db, $tasks, $color, $languageJSON)
+{
+	$dueDate = $currentMilestone['DueDate'];
+	if($dueDate == "2000-01-01")
+	{
+		$dueDate = "-";
+	}
+	else
+	{
+		$dueDate = date_create($dueDate);
+		$dueDate = date_format($dueDate, "d.m.Y");
+	}
+
+	$numberOfOpenTasks = $db->getNumberOfOpenTasks($currentMilestone['ID']);
+	if($numberOfOpenTasks == false)
+	{
+		header('Location: error.php?message=error_database_connection');
+		exit;
+	}
+	else
+	{
+		$numberOfOpenTasks = $numberOfOpenTasks['count'];
+		$percentage = ($numberOfOpenTasks / sizeof($tasks))*100;
+		$percentage = round($percentage);
+
+		echo '<div class="card padding white milestone">' .
+			'<div class="card-content">' .
+			'<div class="'.$color.' center-align milestone-title">' .
+			'<span class="card-title bold padding-left-and-right truncate">' . $currentMilestone['VersionName'] . ' - ' . $currentMilestone['Title'] . '</span>' .
+			'</div>' .
+			'<div class="milestone-content margin-top">' .
+			'<div class="white progress-container">'.
+			'<div class="progress grey lighten-2 high-progress margin-bottom">'.
+			'<div class="determinate green" style="width: '.$percentage.'%"></div>'.
+			'</div>'.
+			'</div>'.
+			'<div class="row">' .
+			'<div class="col s6 valign-wrapper">' .
+			'<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->due_by . ' ' . $dueDate . '</span>' .
+			'</div>' .
+			'<div class="col s6 valign-wrapper">' .
+			'<i class="material-icons valign">event</i><span class="valign margin-left">'.$percentage.'% ' . $languageJSON->done .'</span>' .
+			'</div>' .
+			'</div>' .
+			'<ul class="collapsible white" data-collapsible="accordion">';
+		for($k = 0; $k < sizeof($tasks); $k++)
+		{
+			$currentTask = $tasks[$k];
+
+			$subtasks = $db->getSubtasks($currentTask['ID']);
+			if($subtasks == false)
+			{
+				//inDev
+				if($currentTask['Status'] == 0)
+				{
+					echo '<li>' .
+						'<div class="collapsible-header bold"><i class="material-icons red-text">build</i>' . $currentTask['Title'] . '</div>' .
+						'<div class="collapsible-body"><p>' . $currentTask['Description'] . '</p></div>' .
+						'</li>';
+				}
+				//done
+				else
+				{
+					echo '<li>' .
+						'<div class="collapsible-header bold"><i class="material-icons green-text">check</i>' . $currentTask['Title'] . '</div>' .
+						'<div class="collapsible-body"><p>' . $currentTask['Description'] . '</p></div>' .
+						'</li>';
+				}
+			}
+			else
+			{
+				printSubTasksDone($currentTask, $subtasks, $db);
+			}
+		}
+
+		echo '</ul>' .
+			'</div>' .
+			'</div>' .
+			'</div>';
+	}
+}
+
+function printSubTasksDone($currentTask, $subtasks, $db)
+{
+	$numberOfOpenSubtasks = $db->getNumberOfOpenSubtasks($currentTask['ID']);
+	if($numberOfOpenSubtasks == false)
+	{
+		header('Location: error.php?message=error_database_connection');
+		exit;
+	}
+	else
+	{
+		$numberOfOpenSubtasks = $numberOfOpenSubtasks['count'];
+		if($numberOfOpenSubtasks == sizeof($subtasks))
+		{
+			echo '<li>' .
+				'<div class="collapsible-header bold"><i class="material-icons green-text">check</i>Layout<span class="right">' . $numberOfOpenSubtasks . '/' . sizeof($subtasks) . '</span></div>' .
+				'<div class="collapsible-body">' .
+				'<ul class="collapsible white margin-left-and-right no-shadow margin-top-and-bottom" data-collapsible="accordion">';
+		}
+		else
+		{
+			echo '<li>' .
+				'<div class="collapsible-header bold"><i class="material-icons red-text">build</i>Layout<span class="right">' . $numberOfOpenSubtasks . '/' . sizeof($subtasks) . '</span></div>' .
+				'<div class="collapsible-body">' .
+				'<ul class="collapsible white margin-left-and-right no-shadow margin-top-and-bottom" data-collapsible="accordion">';
+		}
+
+		for($m = 0; $m < sizeof($subtasks); $m++)
+		{
+			$currentSubTask = $subtasks[$m];
+			//inDev
+			if($currentSubTask['Status'] == 0)
+			{
+				echo '<li>' .
+					'<div class="collapsible-header bold"><span class="left">' . ($m + 1) . '</span><i class="material-icons red-text margin-left">build</i>' . $currentSubTask['Title'] . '</div>' .
+					'<div class="collapsible-body"><p>' . $currentSubTask['Description'] . '</p></div>' .
+					'</li>';
+			}
+			//done
+			else
+			{
+				echo '<li>' .
+					'<div class="collapsible-header bold"><span class="left">' . ($m + 1) . '</span><i class="material-icons green-text margin-left">check</i>' . $currentSubTask['Title'] . '</div>' .
+					'<div class="collapsible-body"><p>' . $currentSubTask['Description'] . '</p></div>' .
+					'</li>';
+			}
+		}
+
+		echo '</ul>' .
+			'</div>' .
+			'</li>';
+	}
+}
+
+function printMilestoneDoneAndNoTasks($color, $currentMilestone, $isFirstMilestone, $languageJSON, $dueDate, $completionDate)
+{
+	echo '<div class="card padding white milestone">' .
+		'<div class="card-content">' .
+		'<div class="'.$color.' center-align milestone-title">' .
+		'<span class="card-title bold padding-left-and-right truncate">' . $currentMilestone['VersionName'] . ' - ' . $currentMilestone['Title'] . '</span>' .
+		'</div>';
+
+	if($isFirstMilestone)
+	{
+		echo '<div class="milestone-content margin-top init-as-expanded">';
+	}
+	else
+	{
+		echo '<div class="milestone-content margin-top">';
+	}
+
+	echo '<div class="row">' .
+		'<div class="col s6 valign-wrapper">' .
+		'<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->due_by . ' ' . $dueDate . '</span>' .
+		'</div>' .
+		'<div class="col s6 valign-wrapper">' .
+		'<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->done_at . ' ' . $completionDate . '</span>' .
+		'</div>' .
+		'</div>' .
+		'</div>' .
+		'</div>' .
+		'</div>';
+}
+
+function printMilestoneDoneWithTasks($color, $currentMilestone, $isFirstMilestone, $languageJSON, $dueDate, $completionDate, $tasks, $db)
+{
+	echo '<div class="card padding white milestone">' .
+		'<div class="card-content">' .
+		'<div class="'.$color.' center-align milestone-title">' .
+		'<span class="card-title bold padding-left-and-right truncate">' . $currentMilestone['VersionName'] . ' - ' . $currentMilestone['Title'] . '</span>' .
+		'</div>';
+
+	if($isFirstMilestone)
+	{
+		echo '<div class="milestone-content margin-top init-as-expanded">';
+	}
+	else
+	{
+		echo '<div class="milestone-content margin-top">';
+	}
+
+	echo '<div class="row">' .
+		'<div class="col s6 valign-wrapper">' .
+		'<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->due_by . ' ' . $dueDate . '</span>' .
+		'</div>' .
+		'<div class="col s6 valign-wrapper">' .
+		'<i class="material-icons valign">event</i><span class="valign margin-left">' . $languageJSON->done_at . ' ' . $completionDate . '</span>' .
+		'</div>' .
+		'</div>' .
+		'<ul class="collapsible white" data-collapsible="accordion">';
+	for($k = 0; $k < sizeof($tasks); $k++)
+	{
+		$currentTask = $tasks[$k];
+
+		$subtasks = $db->getSubtasks($currentTask['ID']);
+		if($subtasks == false)
+		{
+			echo '<li>' .
+				'<div class="collapsible-header bold"><i class="material-icons green-text">check</i>' . $currentTask['Title'] . '</div>' .
+				'<div class="collapsible-body"><p>' . $currentTask['Description'] . '</p></div>' .
+				'</li>';
+		}
+		else
+		{
+			$numberOfOpenSubtasks = $db->getNumberOfOpenSubtasks($currentTask['ID']);
+			if($numberOfOpenSubtasks != false)
+			{
+				$numberOfOpenSubtasks = $numberOfOpenSubtasks['count'];
+				if($numberOfOpenSubtasks == sizeof($subtasks))
+				{
+					echo '<li>' .
+						'<div class="collapsible-header bold"><i class="material-icons green-text">check</i>Layout<span class="right">' . $numberOfOpenSubtasks . '/' . sizeof($subtasks) . '</span></div>' .
+						'<div class="collapsible-body">' .
+						'<ul class="collapsible white margin-left-and-right no-shadow margin-top-and-bottom" data-collapsible="accordion">';
+				}
+				else
+				{
+					echo '<li>' .
+						'<div class="collapsible-header bold"><i class="material-icons red-text">build</i>Layout<span class="right">' . $numberOfOpenSubtasks . '/' . sizeof($subtasks) . '</span></div>' .
+						'<div class="collapsible-body">' .
+						'<ul class="collapsible white margin-left-and-right no-shadow margin-top-and-bottom" data-collapsible="accordion">';
+				}
+
+				for($m = 0; $m < sizeof($subtasks); $m++)
+				{
+					$currentSubTask = $subtasks[$m];
+					//inDev
+					if($currentSubTask['Status'] == 0)
+					{
+						echo '<li>' .
+							'<div class="collapsible-header bold"><span class="left">' . ($m + 1) . '</span><i class="material-icons red-text margin-left">build</i>' . $currentSubTask['Title'] . '</div>' .
+							'<div class="collapsible-body"><p>' . $currentSubTask['Description'] . '</p></div>' .
+							'</li>';
+					}
+					//done
+					else
+					{
+						echo '<li>' .
+							'<div class="collapsible-header bold"><span class="left">' . ($m + 1) . '</span><i class="material-icons green-text margin-left">check</i>' . $currentSubTask['Title'] . '</div>' .
+							'<div class="collapsible-body"><p>' . $currentSubTask['Description'] . '</p></div>' .
+							'</li>';
+					}
+				}
+
+				echo '</ul>' .
+					'</div>' .
+					'</li>';
+			}
+		}
+	}
+
+	echo '</ul>' .
+		'</div>' .
+		'</div>' .
+		'</div>';
+}
\ No newline at end of file
diff --git a/php/language.json b/php/language.json
index 0b0ef12..25d2f82 100644
--- a/php/language.json
+++ b/php/language.json
@@ -1,5 +1,11 @@
 {
   "due_by": "Due by",
   "done": "Done",
-  "done_at": "Done at"
+  "done_at": "Done at",
+  "error_general": "An error occured",
+  "error_param_missing": "ERROR: parameter missing",
+  "error_param_invalid": "ERROR: parameter is not numeric or less than 1",
+  "error_roadmap_not_existing": "ERROR: no roadmap with this ID existing",
+  "error_no_milestones": "ERROR: no milestones for this roadmap",
+  "error_database_connection" : "An error occurred while getting data from the server."
 }
\ No newline at end of file
-- 
GitLab