Browse Source

Upgrade - Source Code: Preview link to view list of changed files before upgrading.

fusionate 1 year ago
parent
commit
e60aba062d
2 changed files with 235 additions and 22 deletions
  1. 102 1
      core/upgrade/app_languages.php
  2. 133 21
      core/upgrade/index.php

+ 102 - 1
core/upgrade/app_languages.php

@@ -900,6 +900,81 @@ $text['header-database_type']['zh-cn'] = "数据库类型";
 $text['header-database_type']['ja-jp'] = "データベースタイプ";
 $text['header-database_type']['ko-kr'] = "데이터베이스 유형";
 
+$text['header-source_code_upgrade_preview']['en-us'] = "Source Code Upgrade Preview";
+$text['header-source_code_upgrade_preview']['en-gb'] = "Source Code Upgrade Preview";
+$text['header-source_code_upgrade_preview']['ar-eg'] = "معاينة ترقية كود المصدر";
+$text['header-source_code_upgrade_preview']['de-at'] = "Vorschau des Quellcode-Upgrades";
+$text['header-source_code_upgrade_preview']['de-ch'] = "Vorschau des Quellcode-Upgrades";
+$text['header-source_code_upgrade_preview']['de-de'] = "Vorschau des Quellcode-Upgrades";
+$text['header-source_code_upgrade_preview']['el-gr'] = "Προεπισκόπηση αναβάθμισης πηγαίου κώδικα";
+$text['header-source_code_upgrade_preview']['es-cl'] = "Vista previa de actualización del código fuente";
+$text['header-source_code_upgrade_preview']['es-mx'] = "Vista previa de actualización del código fuente";
+$text['header-source_code_upgrade_preview']['fr-ca'] = "Aperçu de la mise à niveau du code source";
+$text['header-source_code_upgrade_preview']['fr-fr'] = "Aperçu de la mise à niveau du code source";
+$text['header-source_code_upgrade_preview']['he-il'] = "תצוגה מקדימה של שדרוג קוד מקור";
+$text['header-source_code_upgrade_preview']['it-it'] = "Anteprima dell'aggiornamento del codice sorgente";
+$text['header-source_code_upgrade_preview']['nl-nl'] = "Voorbeeld van broncode-upgrade";
+$text['header-source_code_upgrade_preview']['pl-pl'] = "Podgląd aktualizacji kodu źródłowego";
+$text['header-source_code_upgrade_preview']['pt-br'] = "Visualização da atualização do código-fonte";
+$text['header-source_code_upgrade_preview']['pt-pt'] = "Visualização da atualização do código-fonte";
+$text['header-source_code_upgrade_preview']['ro-ro'] = "Previzualizare upgrade cod sursă";
+$text['header-source_code_upgrade_preview']['ru-ru'] = "Предварительный просмотр обновления исходного кода";
+$text['header-source_code_upgrade_preview']['sv-se'] = "Förhandsgranskning av källkodsuppgradering";
+$text['header-source_code_upgrade_preview']['uk-ua'] = "Попередній перегляд оновлення вихідного коду";
+$text['header-source_code_upgrade_preview']['zh-cn'] = "源代码升级预览";
+$text['header-source_code_upgrade_preview']['ja-jp'] = "ソースコードのアップグレードプレビュー";
+$text['header-source_code_upgrade_preview']['ko-kr'] = "소스 코드 업그레이드 미리보기";
+
+$text['description-source_code_changes_found']['en-us'] = "The following APP_NAME source code files have been changed since you last upgraded...";
+$text['description-source_code_changes_found']['en-gb'] = "The following APP_NAME source code files have been changed since you last upgraded...";
+$text['description-source_code_changes_found']['ar-eg'] = "تم تغيير ملفات كود مصدر APP_NAME التالية منذ آخر ترقية...";
+$text['description-source_code_changes_found']['de-at'] = "Die folgenden APP_NAME-Quellcodedateien wurden seit Ihrem letzten Upgrade geändert ...";
+$text['description-source_code_changes_found']['de-ch'] = "Die folgenden APP_NAME-Quellcodedateien wurden seit Ihrem letzten Upgrade geändert ...";
+$text['description-source_code_changes_found']['de-de'] = "Die folgenden APP_NAME-Quellcodedateien wurden seit Ihrem letzten Upgrade geändert ...";
+$text['description-source_code_changes_found']['el-gr'] = "Τα ακόλουθα αρχεία πηγαίου κώδικα της APP_NAME έχουν αλλάξει από την τελευταία αναβάθμιση...";
+$text['description-source_code_changes_found']['es-cl'] = "Los siguientes archivos de código fuente de APP_NAME se han modificado desde la última vez que actualizaste...";
+$text['description-source_code_changes_found']['es-mx'] = "Los siguientes archivos de código fuente de APP_NAME se han modificado desde la última vez que actualizaste...";
+$text['description-source_code_changes_found']['fr-ca'] = "Les fichiers de code source APP_NAME suivants ont été modifiés depuis votre dernière mise à niveau...";
+$text['description-source_code_changes_found']['fr-fr'] = "Les fichiers de code source APP_NAME suivants ont été modifiés depuis votre dernière mise à niveau...";
+$text['description-source_code_changes_found']['he-il'] = "I seguenti file del codice sorgente APP_NAME sono stati modificati dall'ultimo aggiornamento...";
+$text['description-source_code_changes_found']['it-it'] = "I seguenti file del codice sorgente APP_NAME sono stati modificati dall'ultimo aggiornamento...";
+$text['description-source_code_changes_found']['nl-nl'] = "De volgende broncodebestanden van APP_NAME zijn gewijzigd sinds u voor het laatst een upgrade heeft uitgevoerd...";
+$text['description-source_code_changes_found']['pl-pl'] = "Następujące pliki kodu źródłowego aplikacji APP_NAME zostały zmienione od czasu ostatniej aktualizacji...";
+$text['description-source_code_changes_found']['pt-br'] = "Os seguintes arquivos de código-fonte APP_NAME foram alterados desde a última atualização...";
+$text['description-source_code_changes_found']['pt-pt'] = "Os seguintes arquivos de código-fonte APP_NAME foram alterados desde a última atualização...";
+$text['description-source_code_changes_found']['ro-ro'] = "Următoarele fișiere de cod sursă APP_NAME au fost modificate de la ultima actualizare...";
+$text['description-source_code_changes_found']['ru-ru'] = "Следующие файлы исходного кода приложения APP_NAME были изменены с момента последнего обновления...";
+$text['description-source_code_changes_found']['sv-se'] = "Följande källkodsfiler för APP_NAME har ändrats sedan du senast uppgraderade...";
+$text['description-source_code_changes_found']['uk-ua'] = "Наступні файли вихідного коду APP_NAME було змінено після останнього оновлення...";
+$text['description-source_code_changes_found']['zh-cn'] = "自您上次升级以来,以下 APP_NAME 源代码文件已更改...";
+$text['description-source_code_changes_found']['ja-jp'] = "次の APP_NAME ソース コード ファイルは、最後にアップグレードしてから変更されています...";
+$text['description-source_code_changes_found']['ko-kr'] = "마지막 업그레이드 이후 다음 APP_NAME 소스 코드 파일이 변경되었습니다.";
+
+$text['description-source_code_no_changes_found']['en-us'] = "No APP_NAME source code changes were detected.";
+$text['description-source_code_no_changes_found']['en-gb'] = "No APP_NAME source code changes were detected.";
+$text['description-source_code_no_changes_found']['ar-eg'] = "لم يتم اكتشاف أي تغييرات في كود مصدر APP_NAME.";
+$text['description-source_code_no_changes_found']['de-at'] = "Es wurden keine Änderungen am APP_NAME-Quellcode festgestellt.";
+$text['description-source_code_no_changes_found']['de-ch'] = "Es wurden keine Änderungen am APP_NAME-Quellcode festgestellt.";
+$text['description-source_code_no_changes_found']['de-de'] = "Es wurden keine Änderungen am APP_NAME-Quellcode festgestellt.";
+$text['description-source_code_no_changes_found']['el-gr'] = "Δεν εντοπίστηκαν αλλαγές στον πηγαίο κώδικα της εφαρμογής APP_NAME.";
+$text['description-source_code_no_changes_found']['es-cl'] = "No se detectaron cambios en el código fuente de APP_NAME.";
+$text['description-source_code_no_changes_found']['es-mx'] = "No se detectaron cambios en el código fuente de APP_NAME.";
+$text['description-source_code_no_changes_found']['fr-ca'] = "Aucune modification du code source de APP_NAME n'a été détectée.";
+$text['description-source_code_no_changes_found']['fr-fr'] = "Aucune modification du code source de APP_NAME n'a été détectée.";
+$text['description-source_code_no_changes_found']['he-il'] = "לא זוהו שינויים בקוד המקור של APP_NAME.";
+$text['description-source_code_no_changes_found']['it-it'] = "Non è stata rilevata alcuna modifica al codice sorgente APP_NAME.";
+$text['description-source_code_no_changes_found']['nl-nl'] = "Er zijn geen wijzigingen in de broncode van APP_NAME gedetecteerd.";
+$text['description-source_code_no_changes_found']['pl-pl'] = "Nie wykryto żadnych zmian w kodzie źródłowym aplikacji APP_NAME.";
+$text['description-source_code_no_changes_found']['pt-br'] = "Nenhuma alteração no código-fonte do APP_NAME foi detectada.";
+$text['description-source_code_no_changes_found']['pt-pt'] = "Nenhuma alteração no código-fonte do APP_NAME foi detectada.";
+$text['description-source_code_no_changes_found']['ro-ro'] = "Nu au fost detectate modificări ale codului sursă APP_NAME.";
+$text['description-source_code_no_changes_found']['ru-ru'] = "Никаких изменений исходного кода приложения APP_NAME не обнаружено.";
+$text['description-source_code_no_changes_found']['sv-se'] = "Inga ändringar av källkoden för APP_NAME upptäcktes.";
+$text['description-source_code_no_changes_found']['uk-ua'] = "Змін вихідного коду APP_NAME не виявлено.";
+$text['description-source_code_no_changes_found']['zh-cn'] = "未检测到 APP_NAME 源代码更改。";
+$text['description-source_code_no_changes_found']['ja-jp'] = "APP_NAME ソース コードの変更は検出されませんでした。";
+$text['description-source_code_no_changes_found']['ko-kr'] = "APP_NAME 소스 코드 변경사항이 감지되지 않았습니다.";
+
 $text['description-upgrade_source']['en-us'] = "Updates FusionPBX source files from the repository.";
 $text['description-upgrade_source']['en-gb'] = "Updates FusionPBX source files from the repository.";
 $text['description-upgrade_source']['ar-eg'] = "(أحدث ملفات مصادر (فيوس بي إكس من المستودع";
@@ -1275,4 +1350,30 @@ $text['title-cli_upgrade']['zh-cn'] = "";
 $text['title-cli_upgrade']['ja-jp'] = "";
 $text['title-cli_upgrade']['ko-kr'] = "";
 
-?>
+$text['button-preview']['en-us'] = "Preview";
+$text['button-preview']['en-gb'] = "Preview";
+$text['button-preview']['ar-eg'] = "معاينة";
+$text['button-preview']['de-at'] = "Vorschau";
+$text['button-preview']['de-ch'] = "Vorschau";
+$text['button-preview']['de-de'] = "Vorschau";
+$text['button-preview']['el-gr'] = "Προεπισκόπηση";
+$text['button-preview']['es-cl'] = "Prevista";
+$text['button-preview']['es-mx'] = "Prevista";
+$text['button-preview']['fr-ca'] = "Aperçu";
+$text['button-preview']['fr-fr'] = "Aperçu";
+$text['button-preview']['he-il'] = "תצוגה מקדימה";
+$text['button-preview']['it-it'] = "Anteprima";
+$text['button-preview']['nl-nl'] = "preview";
+$text['button-preview']['pl-pl'] = "Podgląd";
+$text['button-preview']['pt-br'] = "Visualização";
+$text['button-preview']['pt-pt'] = "Pré-Visualização";
+$text['button-preview']['ro-ro'] = "previzualizare";
+$text['button-preview']['ru-ru'] = "Предпросмотр";
+$text['button-preview']['sv-se'] = "Förhandsgranska";
+$text['button-preview']['uk-ua'] = "Огляд";
+$text['button-preview']['tr-tr'] = "Ön izleme";
+$text['button-preview']['zh-cn'] = "预览";
+$text['button-preview']['ja-jp'] = "プレビュー";
+$text['button-preview']['ko-kr'] = "시사";
+
+?>

+ 133 - 21
core/upgrade/index.php

@@ -160,6 +160,57 @@
 	if (is_array($updateable_repos)) { $repos_count = @sizeof($updateable_repos); }
 	$repos_count++;
 
+//process the http get (source preview)
+	if (!empty($_GET['preview'])) {
+		if (!empty($updateable_repos)) {
+			foreach ($updateable_repos as $app_path => $app) {
+				$repo_info = git_repo_info($app_path);
+				if (empty($repo_info)) { continue; }
+				$source_code[$app['app']] = $app_path;
+			}
+		}
+		if ($_GET['preview'] == 'core') {
+			$command = 'cd '.$_SERVER['PROJECT_ROOT'].' && git fetch && git diff --name-only @ @{u}';
+		}
+		else if (array_key_exists($_GET['preview'], $source_code)) {
+			$command = 'cd '.$source_code[$_GET['preview']].' && git fetch && git diff --name-only @ @{u}';
+		}
+		if (!empty($command)) {
+			$response = explode(PHP_EOL, shell_exec($command));
+			// simplify response
+			if (!empty($response)) {
+				foreach ($response as $l => $line) {
+					if (empty($line)) { unset($response[$l]); }
+					if (substr($line, 0, 8) == 'remote: ') { unset($response[$l]); }
+					if (substr($line, 0, 8) == 'remote: ') { unset($response[$l]); }
+					if (substr($line, 0, 19) == 'Unpacking objects: ') { unset($response[$l]); }
+					if (substr($line, 0, 5) == 'From ') { unset($response[$l]); }
+					if (substr($line, 0, 3) == '   ') { unset($response[$l]); }
+				}
+			}
+			echo "<button type='button' class='btn btn-default' style='float: right;' onclick=\"$('#source_preview_layer').fadeOut(200);\">".$text['button-close']."</button>\n";
+			echo "<b>".$text['header-source_code_upgrade_preview']."</b>\n";
+			echo "<br><br>\n";
+			if (!empty($response) && is_array($response)) {
+				echo str_replace('APP_NAME', (!empty($_GET['title']) ? "<strong>".$_GET['title']."</strong>" : null), $text['description-source_code_changes_found']);
+				echo "<br><br><br>\n";
+				echo "<div style='width: 100%; max-height: 250px; overflow: auto; border: 1px solid ".($_SESSION['theme']['table_row_border_color']['text'] ?? '#c5d1e5')."; padding: 12px 15px; background-color: ".($_SESSION['theme']['table_row_background_color_light']['text'] ?? '#fff')."; font-family: monospace; font-size: 85%; color: green;'>\n";
+				if (!empty($response) && is_array($response)) {
+					echo implode("<br>\n<hr style='margin: 3px 0;'>\n", $response);
+				}
+				echo "</div>\n";
+			}
+			else {
+				echo str_replace('APP_NAME', (!empty($_GET['title']) ? "<strong>".$_GET['title']."</strong>" : null), $text['description-source_code_no_changes_found']);
+			}
+			echo "<br><br>\n";
+			echo "<center>\n";
+			echo "	<button type='button' class='btn btn-default' style='margin-top: 15px;' onclick=\"$('#source_preview_layer').fadeOut(200);\">".$text['button-close']."</button>\n";
+			echo "</center>\n";
+			exit;
+		}
+	}
+
 //adjust color and initialize step counter
 	$step = 1;
 	$step_color = isset($_SESSION['theme']['upgrade_step_color']['text']) ? $_SESSION['theme']['upgrade_step_color']['text'] : color_adjust((!empty($_SESSION['theme']['form_table_label_background_color']['text']) ? $_SESSION['theme']['form_table_label_background_color']['text'] : '#e5e9f0'), -0.1);
@@ -170,6 +221,46 @@
 	$document['title'] = $text['title-upgrade'];
 	require_once "resources/header.php";
 
+//source preview layer
+	echo "<style>\n";
+	echo "	#source_preview_layer {\n";
+	echo "		z-index: 999999;\n";
+	echo "		position: absolute;\n";
+	echo "		left: 0px;\n";
+	echo "		top: 0px;\n";
+	echo "		right: 0px;\n";
+	echo "		bottom: 0px;\n";
+	echo "		text-align: center;\n";
+	echo "		vertical-align: middle;\n";
+	echo "		}\n";
+	echo "	#source_preview_container {\n";
+	echo "		display: block;\n";
+	echo "		overflow: auto;\n";
+	echo "		background-color: #fff;\n";
+	echo "		padding: 25px 25px;\n";
+	if (http_user_agent('mobile')) {
+		echo "	margin: 0;\n";
+	}
+	else {
+		echo "	margin: auto 10%;\n";
+	}
+	echo "		text-align: left;\n";
+	echo "		-webkit-box-shadow: 0px 1px 20px #888;\n";
+	echo "		-moz-box-shadow: 0px 1px 20px #888;\n";
+	echo "		box-shadow: 0px 1px 20px #888;\n";
+	echo "		}\n";
+	echo "</style>\n";
+
+	echo "<div id='source_preview_layer' style='display: none;'>\n";
+	echo "	<table cellpadding='0' cellspacing='0' border='0' width='100%' height='100%'>\n";
+	echo "		<tr>\n";
+	echo "			<td align='center' valign='middle'>\n";
+	echo "				<span id='source_preview_container'></span>\n";
+	echo "			</td>\n";
+	echo "		</tr>\n";
+	echo "	</table>\n";
+	echo "</div>\n";
+
 //show the content
 	echo "<form name='frm' id='frm' method='post'>\n";
 
@@ -206,7 +297,7 @@
 		echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
 		echo "<tr onclick=\"if (document.getElementById('do_source')) { document.getElementById('do_source').checked = !document.getElementById('do_source').checked; if (document.getElementById('do_source').checked == false) { document.getElementById('view_source_code_options').checked = false; } }\">\n";
 		echo "	<td width='30%' class='vncell' style='vertical-align: middle;'>\n";
-		echo "		".(isset($_SESSION['theme']['title']['text'])  ?$_SESSION['theme']['title']['text'] : 'FusionPBX')."\n";
+		echo "		".(isset($_SESSION['theme']['title']['text']) ? $_SESSION['theme']['title']['text'] : 'FusionPBX')."\n";
 		echo "	</td>\n";
 		echo "	<td width='70%' class='vtable' style='height: 50px; cursor: pointer;'>\n";
 		echo "		<input type='checkbox' name='action[upgrade_source]' id='do_source' value='1' onclick=\"event.stopPropagation(); if (this.checked == false) { document.getElementById('view_source_code_options').checked = false; }\">\n";
@@ -223,31 +314,35 @@
 		}
 		if ($branch_return_value == 0 && $commit_return_value == 0) {
 			echo "	<a href='https://github.com/fusionpbx/fusionpbx/compare/".$git_current_commit."...".$git_current_branch."' target='_blank' title='".$git_current_commit."' onclick=\"event.stopPropagation();\"><i>".$git_current_branch."</i></a>";
+			echo "&nbsp;&nbsp;<button type='button' class='btn btn-link btn-xs' onclick=\"event.stopPropagation(); source_preview('core','".(isset($_SESSION['theme']['title']['text']) ? $_SESSION['theme']['title']['text'] : 'FusionPBX')."');\">".$text['button-preview']."</button>\n";
 		}
 		echo "	</td>\n";
 		echo "</tr>\n";
 		echo "</table>\n";
 
-		foreach ($updateable_repos as $repo => $app) {
-			$repo_info = git_repo_info($repo);
-			$pull_method = substr($repo_info['url'], 0, 4) == 'http' ? 'http' : 'ssh';
-			if (!$repo_info) { continue; }
-			echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
-			echo "<tr onclick=\"if (document.getElementById('do_".$app['app']."')) { document.getElementById('do_".$app['app']."').checked = !document.getElementById('do_".$app['app']."').checked; if (document.getElementById('do_".$app['app']."').checked == false) { document.getElementById('view_source_code_options').checked = false; } }\">\n";
-			echo "	<td width='30%' class='vncell' style='vertical-align: middle;'>\n";
-			echo "		".$app['name']."\n";
-			echo "	</td>\n";
-			echo "	<td width='70%' class='vtable' style='height: 50px; cursor: ".($pull_method == 'http' ? "pointer;'" : "help;' title=\"".$text['message-upgrade_manually'].": ".$repo_info['url']."\"").">\n";
-			if ($pull_method == 'http') {
-				echo "	<input type='checkbox' name='action[optional_apps][]' class='do_optional_app' id='do_".$app['app']."' value='".$app['app']."' onclick=\"event.stopPropagation(); if (this.checked == false) { document.getElementById('view_source_code_options').checked = false; }\"> &nbsp;".$app['description']."<br />\n";
-			}
-			else {
-				echo "	<i class='fas fa-ban mr-3' style='opacity: 0.3; margin: 0 1px;'></i> ".$app['description']."<br>\n";
+		if (!empty($updateable_repos) && is_array($updateable_repos)) {
+			foreach ($updateable_repos as $app_path => $app) {
+				$repo_info = git_repo_info($app_path);
+				$pull_method = substr($repo_info['url'], 0, 4) == 'http' ? 'http' : 'ssh';
+				if (empty($repo_info)) { continue; }
+				echo "<table width='100%' border='0' cellpadding='0' cellspacing='0'>\n";
+				echo "<tr onclick=\"if (document.getElementById('do_".$app['app']."')) { document.getElementById('do_".$app['app']."').checked = !document.getElementById('do_".$app['app']."').checked; if (document.getElementById('do_".$app['app']."').checked == false) { document.getElementById('view_source_code_options').checked = false; } }\">\n";
+				echo "	<td width='30%' class='vncell' style='vertical-align: middle;'>\n";
+				echo "		".$app['name']."\n";
+				echo "	</td>\n";
+				echo "	<td width='70%' class='vtable' style='height: 50px; cursor: ".($pull_method == 'http' ? "pointer;'" : "help;' title=\"".$text['message-upgrade_manually'].": ".$repo_info['url']."\"").">\n";
+				if ($pull_method == 'http') {
+					echo "	<input type='checkbox' name='action[optional_apps][]' class='do_optional_app' id='do_".$app['app']."' value='".$app['app']."' onclick=\"event.stopPropagation(); if (this.checked == false) { document.getElementById('view_source_code_options').checked = false; }\"> &nbsp;".$app['description']."<br />\n";
+				}
+				else {
+					echo "	<i class='fas fa-ban mr-3' style='opacity: 0.3; margin: 0 1px;'></i> ".$app['description']."<br>\n";
+				}
+				echo "		<span style='font-weight: 600;'>".$app['version']."</span>&nbsp;&nbsp;<i><a href='".str_replace(['git@','.com:'],['https://','.com/'], $repo_info['url'])."/compare/".$repo_info['commit']."...".$repo_info['branch']." 'target='_blank' title='".$repo_info['commit']."'>".$repo_info['branch']."</i></a>\n";
+				echo "		&nbsp;&nbsp;<button type='button' class='btn btn-link btn-xs' onclick=\"event.stopPropagation(); source_preview('".$app['app']."','".$app['name']."');\">".$text['button-preview']."</button>\n";
+				echo "	</td>\n";
+				echo "</tr>\n";
+				echo "</table>\n";
 			}
-			echo "		<span style='font-weight: 600;'>".$app['version']."</span>&nbsp;&nbsp;<i><a href='".str_replace(['git@','.com:'],['https://','.com/'], $repo_info['url'])."/compare/".$repo_info['commit']."...".$repo_info['branch']." 'target='_blank' title='".$repo_info['commit']."'>".$repo_info['branch']."</i></a>\n";
-			echo "	</td>\n";
-			echo "</tr>\n";
-			echo "</table>\n";
 		}
 		echo "</div>\n";
 
@@ -374,7 +469,24 @@
 		unset($_SESSION["response"]);
 	}
 
+//source preview script
+	echo "<script>\n";
+	echo "function source_preview(source, title) {\n";
+	echo "	$.ajax({\n";
+	echo "		url: '".$_SERVER['PHP_SELF']."?preview=' + source + '&title=' + title,\n";
+	echo "		type: 'get',\n";
+	echo "		processData: false,\n";
+	echo "		contentType: false,\n";
+	echo "		cache: false,\n";
+	echo "		success: function(response){\n";
+	echo "			$('#source_preview_container').html(response);\n";
+	echo "			$('#source_preview_layer').fadeIn(400);\n";
+	echo "		}\n";
+	echo "	});\n";
+	echo "}\n";
+	echo "</script>\n";
+
 //include the footer
 	require_once "resources/footer.php";
 
-?>
+?>