From bd8e988444ba53d422c27c3d4630ed317ce9c819 Mon Sep 17 00:00:00 2001
From: adrien <adrien@malingrey.fr>
Date: Sun, 20 Oct 2024 15:03:45 +0200
Subject: [PATCH] export head

---
 style.css                   | 13 +++++++
 templates/cards.xsl         | 57 ++++++-----------------------
 templates/compact.xsl       | 73 +++++++------------------------------
 templates/hostsTable.xsl    | 57 ++++++-----------------------
 templates/lib/head.xsl      | 56 ++++++++++++++++++++++++++++
 templates/lib/toast.xsl     | 14 ++++---
 templates/servicesTable.xsl | 57 ++++++-----------------------
 7 files changed, 126 insertions(+), 201 deletions(-)
 create mode 100644 templates/lib/head.xsl

diff --git a/style.css b/style.css
index 093cff8..cfc2692 100644
--- a/style.css
+++ b/style.css
@@ -51,3 +51,16 @@ main {
     --color: hsl(calc(120*var(--free-ratio)) 100% 50%);
     background-image: linear-gradient(to right, var(--color) var(--used-percent), transparent var(--used-percent), transparent) !important;
 }
+
+.compact .ui.icon.buttons .mini.button {
+    padding: 0.5em;
+}
+
+.compact {
+    overflow-x: scroll;
+}
+
+.compact > input{
+    min-width: 10em;
+    padding-right: .1em;
+}
diff --git a/templates/cards.xsl b/templates/cards.xsl
index 0284a97..861170a 100755
--- a/templates/cards.xsl
+++ b/templates/cards.xsl
@@ -4,6 +4,7 @@
     xmlns:xs="http://www.w3.org/2001/XMLSchema"
     version="1.1">
 
+    <xsl:import href="lib/head.xsl"/>
     <xsl:import href="lib/parseCommand.xsl"/>
     <xsl:import href="lib/serviceLabel.xsl"/>
     <xsl:import href="lib/toast.xsl"/>
@@ -33,47 +34,13 @@
         <xsl:variable name="targets" select="substring-after(@args, '.xml ')"/>
         
         <html lang="fr">
-            <head>
-                <meta charset="utf-8"/>
-                <xsl:if test="$refreshPeriod > 0">
-                    <meta http-equiv="refresh">
-                        <xsl:attribute name="content">
-                            <xsl:value-of select="$refreshPeriod"/>
-                            <xsl:text>;URL=</xsl:text>
-                            <xsl:value-of select="$basedir"/>
-                            <xsl:text>/scan.php?targets=</xsl:text>
-                            <xsl:value-of select="$targets"/>
-                            <xsl:text>&amp;</xsl:text>
-                            <xsl:call-template name="parseCommand">
-                                <xsl:with-param name="argList" select="substring-before(substring-after(@args, ' -'), ' -oX')"/>
-                                <xsl:with-param name="asURL" select="true()"/>
-                            </xsl:call-template>
-                            <xsl:text>compareWith=</xsl:text>
-                            <xsl:value-of select="$nextCompareWith"/>
-                            <xsl:text>&amp;refreshPeriod=</xsl:text>
-                            <xsl:value-of select="$refreshPeriod"/>
-                            <xsl:text>&amp;sudo=</xsl:text>
-                            <xsl:value-of select="$sudo"/>
-                        </xsl:attribute>
-                    </meta>
-                </xsl:if>
-                <title>
-                    <xsl:text>lanScan - </xsl:text>
-                    <xsl:value-of select="$targets"/>
-                </title>
-                <link rel="icon" href="{$basedir}/favicon.ico"/>
-                <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/fomantic-ui@2.9.3/dist/semantic.min.css"/>
-                <link href="https://cdn.jsdelivr.net/npm/@yaireo/tagify/dist/tagify.css" rel="stylesheet" type="text/css"/>
-                <link href="https://cdn.datatables.net/v/se/jszip-3.10.1/dt-2.1.8/b-3.1.2/b-html5-3.1.2/b-print-3.1.2/cr-2.0.4/fc-5.0.3/fh-4.0.1/r-3.0.3/datatables.min.css" rel="stylesheet"/>
-                <link href="{$basedir}/style.css" rel="stylesheet" type="text/css"/>
-                <script src="https://code.jquery.com/jquery-3.7.1.js"></script>
-                <script src="https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.9.2/semantic.min.js"></script>
-                <script src="https://cdn.jsdelivr.net/npm/@yaireo/tagify"></script>
-                <script src="https://cdn.jsdelivr.net/npm/@yaireo/tagify/dist/tagify.polyfills.min.js"></script>
-                <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script>
-                <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script>
-                <script src="https://cdn.datatables.net/v/se/jszip-3.10.1/dt-2.1.8/b-3.1.2/b-html5-3.1.2/b-print-3.1.2/cr-2.0.4/fc-5.0.3/fh-4.0.1/r-3.0.3/datatables.min.js"></script>
-            </head>
+            <xsl:apply-templates select="." mode="head">
+                <xsl:with-param name="basedir" select="$basedir"/>
+                <xsl:with-param name="targets" select="$targets"/>
+                <xsl:with-param name="nextCompareWith" select="$nextCompareWith"/>
+                <xsl:with-param name="refreshPeriod" select="$refreshPeriod"/>
+                <xsl:with-param name="sudo" select="$sudo"/>
+            </xsl:apply-templates>
 
             <body>
                 <nav class="ui inverted teal fixed menu">
@@ -131,10 +98,6 @@ Exemples: 192.168.1.0/24 scanme.nmap.org 10.0-255.0-255.1-254"/>
                 <script>
 $('.ui.dropdown').dropdown()
 
-<xsl:apply-templates select="runstats">
-    <xsl:with-param name="init" select="$init"/>
-</xsl:apply-templates>
-
 hiddenButton.onclick = function(event) {
     if (lanScanForm.checkValidity()) {
         targetsInputDiv.classList.add('loading')
@@ -175,6 +138,10 @@ function hostScanning(link) {
     })
 }
                 </script>
+
+                <xsl:apply-templates select="runstats">
+                    <xsl:with-param name="init" select="$init"/>
+                </xsl:apply-templates>
             </body>
         </html>
     </xsl:template>
diff --git a/templates/compact.xsl b/templates/compact.xsl
index 6f94846..2a73002 100755
--- a/templates/compact.xsl
+++ b/templates/compact.xsl
@@ -4,6 +4,7 @@
     xmlns:xs="http://www.w3.org/2001/XMLSchema"
     version="1.1">
 
+    <xsl:import href="lib/head.xsl"/>
     <xsl:import href="lib/parseCommand.xsl"/>
     <xsl:import href="lib/toast.xsl"/> 
 
@@ -32,61 +33,13 @@
         <xsl:variable name="targets" select="substring-after(@args, '.xml ')"/>
         
         <html lang="fr">
-            <head>
-                <meta charset="utf-8"/>
-                <xsl:if test="$refreshPeriod > 0">
-                    <meta http-equiv="refresh">
-                        <xsl:attribute name="content">
-                            <xsl:value-of select="$refreshPeriod"/>
-                            <xsl:text>;URL=</xsl:text>
-                            <xsl:value-of select="$basedir"/>
-                            <xsl:text>/scan.php?targets=</xsl:text>
-                            <xsl:value-of select="$targets"/>
-                            <xsl:text>&amp;</xsl:text>
-                            <xsl:call-template name="parseCommand">
-                                <xsl:with-param name="argList" select="substring-before(substring-after(@args, ' -'), ' -oX')"/>
-                                <xsl:with-param name="asURL" select="true()"/>
-                            </xsl:call-template>
-                            <xsl:text>compareWith=</xsl:text>
-                            <xsl:value-of select="$nextCompareWith"/>
-                            <xsl:text>&amp;refreshPeriod=</xsl:text>
-                            <xsl:value-of select="$refreshPeriod"/>
-                            <xsl:text>&amp;sudo=</xsl:text>
-                            <xsl:value-of select="$sudo"/>
-                        </xsl:attribute>
-                    </meta>
-                </xsl:if>
-                <title>
-                    <xsl:text>lanScan - </xsl:text>
-                    <xsl:value-of select="$targets"/>
-                </title>
-                <link rel="icon" href="{$basedir}/favicon.ico"/>
-                <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/fomantic-ui@2.9.3/dist/semantic.min.css"/>
-                <link href="https://cdn.jsdelivr.net/npm/@yaireo/tagify/dist/tagify.css" rel="stylesheet" type="text/css"/>
-                <link href="https://cdn.datatables.net/v/se/jszip-3.10.1/dt-2.1.8/b-3.1.2/b-html5-3.1.2/b-print-3.1.2/cr-2.0.4/fc-5.0.3/fh-4.0.1/r-3.0.3/datatables.min.css" rel="stylesheet"/>
-                <link href="{$basedir}/style.css" rel="stylesheet" type="text/css"/>
-                <style>
-                    .ui.icon.buttons .mini.button {
-                        padding: 0.5em;
-                    }
-                    
-                    .action {
-                        overflow-x: scroll;
-                    }
-                    
-                    .ui.ui.ui.ui[class*="left icon"]:not(.corner).input &gt; input{
-                        min-width: 10em;
-                        padding-right: .1em;
-                    }                    
-                </style>
-                <script src="https://code.jquery.com/jquery-3.7.1.js"></script>
-                <script src="https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.9.2/semantic.min.js"></script>
-                <script src="https://cdn.jsdelivr.net/npm/@yaireo/tagify"></script>
-                <script src="https://cdn.jsdelivr.net/npm/@yaireo/tagify/dist/tagify.polyfills.min.js"></script>
-                <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script>
-                <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script>
-                <script src="https://cdn.datatables.net/v/se/jszip-3.10.1/dt-2.1.8/b-3.1.2/b-html5-3.1.2/b-print-3.1.2/cr-2.0.4/fc-5.0.3/fh-4.0.1/r-3.0.3/datatables.min.js"></script>
-            </head>
+            <xsl:apply-templates select="." mode="head">
+                <xsl:with-param name="basedir" select="$basedir"/>
+                <xsl:with-param name="targets" select="$targets"/>
+                <xsl:with-param name="nextCompareWith" select="$nextCompareWith"/>
+                <xsl:with-param name="refreshPeriod" select="$refreshPeriod"/>
+                <xsl:with-param name="sudo" select="$sudo"/>
+            </xsl:apply-templates>
 
             <body>
                 <nav class="ui inverted teal fixed menu">
@@ -164,10 +117,6 @@ table.order([1, 'asc']).draw()
 
 $('.ui.dropdown').dropdown()
 
-<xsl:apply-templates select="runstats">
-    <xsl:with-param name="init" select="$init"/>
-</xsl:apply-templates>
-
 hiddenButton.onclick = function(event) {
     if (lanScanForm.checkValidity()) {
         targetsInputDiv.classList.add('loading')
@@ -208,6 +157,10 @@ function hostScanning(link) {
     })
 }
                 </script>
+
+                <xsl:apply-templates select="runstats">
+                    <xsl:with-param name="init" select="$init"/>
+                </xsl:apply-templates>
             </body>
         </html>
     </xsl:template>
@@ -229,7 +182,7 @@ function hostScanning(link) {
         <div class="column">
             <div>
                 <xsl:attribute name="class">
-                    <xsl:text>ui fluid mini left icon input </xsl:text>
+                    <xsl:text>ui fluid mini left icon compact input </xsl:text>
                     <xsl:if test="$currentHost/ports/port | $initHost/ports/port[not(@portid=$currentHost/ports/port/@portid)][not(state/@state='closed')]">
                         <xsl:text>action buttons </xsl:text>
                     </xsl:if>
diff --git a/templates/hostsTable.xsl b/templates/hostsTable.xsl
index c9d69db..3da2512 100755
--- a/templates/hostsTable.xsl
+++ b/templates/hostsTable.xsl
@@ -4,6 +4,7 @@
     xmlns:xs="http://www.w3.org/2001/XMLSchema"
     version="1.1">
 
+    <xsl:import href="lib/head.xsl"/>
     <xsl:import href="lib/parseCommand.xsl"/>
     <xsl:import href="lib/serviceLabel.xsl"/>
     <xsl:import href="lib/toast.xsl"/>
@@ -33,47 +34,13 @@
         <xsl:variable name="targets" select="substring-after(@args, '.xml ')"/>
         
         <html lang="fr">
-            <head>
-                <meta charset="utf-8"/>
-                <xsl:if test="$refreshPeriod > 0">
-                    <meta http-equiv="refresh">
-                        <xsl:attribute name="content">
-                            <xsl:value-of select="$refreshPeriod"/>
-                            <xsl:text>;URL=</xsl:text>
-                            <xsl:value-of select="$basedir"/>
-                            <xsl:text>/scan.php?targets=</xsl:text>
-                            <xsl:value-of select="$targets"/>
-                            <xsl:text>&amp;</xsl:text>
-                            <xsl:call-template name="parseCommand">
-                                <xsl:with-param name="argList" select="substring-before(substring-after(@args, ' -'), ' -oX')"/>
-                                <xsl:with-param name="asURL" select="true()"/>
-                            </xsl:call-template>
-                            <xsl:text>compareWith=</xsl:text>
-                            <xsl:value-of select="$nextCompareWith"/>
-                            <xsl:text>&amp;refreshPeriod=</xsl:text>
-                            <xsl:value-of select="$refreshPeriod"/>
-                            <xsl:text>&amp;sudo=</xsl:text>
-                            <xsl:value-of select="$sudo"/>
-                        </xsl:attribute>
-                    </meta>
-                </xsl:if>
-                <title>
-                    <xsl:text>lanScan - </xsl:text>
-                    <xsl:value-of select="$targets"/>
-                </title>
-                <link rel="icon" href="{$basedir}/favicon.ico"/>
-                <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/fomantic-ui@2.9.3/dist/semantic.min.css"/>
-                <link href="https://cdn.jsdelivr.net/npm/@yaireo/tagify/dist/tagify.css" rel="stylesheet" type="text/css"/>
-                <link href="https://cdn.datatables.net/v/se/jszip-3.10.1/dt-2.1.8/b-3.1.2/b-html5-3.1.2/b-print-3.1.2/cr-2.0.4/fc-5.0.3/fh-4.0.1/r-3.0.3/datatables.min.css" rel="stylesheet"/>
-                <link href="{$basedir}/style.css" rel="stylesheet" type="text/css"/>
-                <script src="https://code.jquery.com/jquery-3.7.1.js"></script>
-                <script src="https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.9.2/semantic.min.js"></script>
-                <script src="https://cdn.jsdelivr.net/npm/@yaireo/tagify"></script>
-                <script src="https://cdn.jsdelivr.net/npm/@yaireo/tagify/dist/tagify.polyfills.min.js"></script>
-                <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script>
-                <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script>
-                <script src="https://cdn.datatables.net/v/se/jszip-3.10.1/dt-2.1.8/b-3.1.2/b-html5-3.1.2/b-print-3.1.2/cr-2.0.4/fc-5.0.3/fh-4.0.1/r-3.0.3/datatables.min.js"></script>
-            </head>
+            <xsl:apply-templates select="." mode="head">
+                <xsl:with-param name="basedir" select="$basedir"/>
+                <xsl:with-param name="targets" select="$targets"/>
+                <xsl:with-param name="nextCompareWith" select="$nextCompareWith"/>
+                <xsl:with-param name="refreshPeriod" select="$refreshPeriod"/>
+                <xsl:with-param name="sudo" select="$sudo"/>
+            </xsl:apply-templates>
 
             <body>
                 <nav class="ui inverted teal fixed menu">
@@ -163,10 +130,6 @@ table.order([1, 'asc']).draw()
 
 $('.ui.dropdown').dropdown()
 
-<xsl:apply-templates select="runstats">
-    <xsl:with-param name="init" select="$init"/>
-</xsl:apply-templates>
-
 hiddenButton.onclick = function(event) {
     if (lanScanForm.checkValidity()) {
         targetsInputDiv.classList.add('loading')
@@ -207,6 +170,10 @@ function hostScanning(link) {
     })
 }
                 </script>
+
+                <xsl:apply-templates select="runstats">
+                    <xsl:with-param name="init" select="$init"/>
+                </xsl:apply-templates>
             </body>
         </html>
     </xsl:template>
diff --git a/templates/lib/head.xsl b/templates/lib/head.xsl
new file mode 100644
index 0000000..4906c9c
--- /dev/null
+++ b/templates/lib/head.xsl
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<xsl:stylesheet
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    version="1.1">
+
+    <xsl:template match="nmaprun" mode="head">
+        <xsl:param name="basedir"/>
+        <xsl:param name="targets"/>
+        <xsl:param name="nextCompareWith"/>
+        <xsl:param name="refreshPeriod"/>
+        <xsl:param name="sudo"/>
+
+        <head>
+            <meta charset="utf-8"/>
+            <xsl:if test="$refreshPeriod > 0">
+                <meta http-equiv="refresh">
+                    <xsl:attribute name="content">
+                        <xsl:value-of select="$refreshPeriod"/>
+                        <xsl:text>;URL=</xsl:text>
+                        <xsl:value-of select="$basedir"/>
+                        <xsl:text>/scan.php?targets=</xsl:text>
+                        <xsl:value-of select="$targets"/>
+                        <xsl:text>&amp;</xsl:text>
+                        <xsl:call-template name="parseCommand">
+                            <xsl:with-param name="argList" select="substring-before(substring-after(@args, ' -'), ' -oX')"/>
+                            <xsl:with-param name="asURL" select="true()"/>
+                        </xsl:call-template>
+                        <xsl:text>compareWith=</xsl:text>
+                        <xsl:value-of select="$nextCompareWith"/>
+                        <xsl:text>&amp;refreshPeriod=</xsl:text>
+                        <xsl:value-of select="$refreshPeriod"/>
+                        <xsl:text>&amp;sudo=</xsl:text>
+                        <xsl:value-of select="$sudo"/>
+                    </xsl:attribute>
+                </meta>
+            </xsl:if>
+            <title>
+                <xsl:text>lanScan - </xsl:text>
+                <xsl:value-of select="$targets"/>
+            </title>
+            <link rel="icon" href="{$basedir}/favicon.ico"/>
+            <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/fomantic-ui@2.9.3/dist/semantic.min.css"/>
+            <link href="https://cdn.jsdelivr.net/npm/@yaireo/tagify/dist/tagify.css" rel="stylesheet" type="text/css"/>
+            <link href="https://cdn.datatables.net/v/se/jszip-3.10.1/dt-2.1.8/b-3.1.2/b-html5-3.1.2/b-print-3.1.2/cr-2.0.4/fc-5.0.3/fh-4.0.1/r-3.0.3/datatables.min.css" rel="stylesheet"/>
+            <link href="{$basedir}/style.css" rel="stylesheet" type="text/css"/>
+            <script src="https://code.jquery.com/jquery-3.7.1.js"></script>
+            <script src="https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.9.2/semantic.min.js"></script>
+            <script src="https://cdn.jsdelivr.net/npm/@yaireo/tagify"></script>
+            <script src="https://cdn.jsdelivr.net/npm/@yaireo/tagify/dist/tagify.polyfills.min.js"></script>
+            <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script>
+            <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script>
+            <script src="https://cdn.datatables.net/v/se/jszip-3.10.1/dt-2.1.8/b-3.1.2/b-html5-3.1.2/b-print-3.1.2/cr-2.0.4/fc-5.0.3/fh-4.0.1/r-3.0.3/datatables.min.js"></script>
+        </head>
+    </xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/templates/lib/toast.xsl b/templates/lib/toast.xsl
index 966a69d..cf9b7c5 100644
--- a/templates/lib/toast.xsl
+++ b/templates/lib/toast.xsl
@@ -6,7 +6,8 @@
 
     <xsl:template match="runstats">
         <xsl:param name="init"/>
-        <xsl:if test="finished/@summary">
+        <script>
+            <xsl:if test="finished/@summary">
 $.toast({
     title      : '<xsl:value-of select="finished/@exit"/>',
     message    : '<xsl:value-of select="finished/@summary"/>',
@@ -15,8 +16,8 @@ $.toast({
     closeIcon  : true,
     position   : 'bottom right',
 })
-        </xsl:if>
-        <xsl:if test="finished/@errormsg">
+            </xsl:if>
+            <xsl:if test="finished/@errormsg">
 $.toast({
     title      : '<xsl:value-of select="finished/@exit"/>',
     message    : '<xsl:value-of select="finished/@errormsg"/>',
@@ -26,8 +27,8 @@ $.toast({
     closeIcon  : true,
     position   : 'bottom right',
 })
-        </xsl:if>
-        <xsl:if test="$init/runstats/finished">
+            </xsl:if>
+            <xsl:if test="$init/runstats/finished">
 $.toast({
     message    : 'Comparaison avec les résultats du <xsl:value-of select="$init/runstats/finished/@timestr"/>',
     class      : 'info',
@@ -36,7 +37,8 @@ $.toast({
     closeIcon  : true,
     position   : 'bottom right',
 })
-        </xsl:if>
+            </xsl:if>
+        </script>
     </xsl:template>
 
 </xsl:stylesheet>
\ No newline at end of file
diff --git a/templates/servicesTable.xsl b/templates/servicesTable.xsl
index db4ac45..8ead00a 100755
--- a/templates/servicesTable.xsl
+++ b/templates/servicesTable.xsl
@@ -4,6 +4,7 @@
     xmlns:xs="http://www.w3.org/2001/XMLSchema"
     version="1.1">
 
+    <xsl:import href="lib/head.xsl"/>
     <xsl:import href="lib/parseCommand.xsl"/> 
     <xsl:import href="lib/toast.xsl"/>
 
@@ -32,47 +33,13 @@
         <xsl:variable name="targets" select="substring-after(@args, '.xml ')"/>
         
         <html lang="fr">
-            <head>
-                <meta charset="utf-8"/>
-                <xsl:if test="$refreshPeriod > 0">
-                    <meta http-equiv="refresh">
-                        <xsl:attribute name="content">
-                            <xsl:value-of select="$refreshPeriod"/>
-                            <xsl:text>;URL=</xsl:text>
-                            <xsl:value-of select="$basedir"/>
-                            <xsl:text>/scan.php?targets=</xsl:text>
-                            <xsl:value-of select="$targets"/>
-                            <xsl:text>&amp;</xsl:text>
-                            <xsl:call-template name="parseCommand">
-                                <xsl:with-param name="argList" select="substring-before(substring-after(@args, ' -'), ' -oX')"/>
-                                <xsl:with-param name="asURL" select="true()"/>
-                            </xsl:call-template>
-                            <xsl:text>compareWith=</xsl:text>
-                            <xsl:value-of select="$nextCompareWith"/>
-                            <xsl:text>&amp;refreshPeriod=</xsl:text>
-                            <xsl:value-of select="$refreshPeriod"/>
-                            <xsl:text>&amp;sudo=</xsl:text>
-                            <xsl:value-of select="$sudo"/>
-                        </xsl:attribute>
-                    </meta>
-                </xsl:if>
-                <title>
-                    <xsl:text>lanScan - </xsl:text>
-                    <xsl:value-of select="$targets"/>
-                </title>
-                <link rel="icon" href="{$basedir}/favicon.ico"/>
-                <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/fomantic-ui@2.9.3/dist/semantic.min.css"/>
-                <link href="https://cdn.jsdelivr.net/npm/@yaireo/tagify/dist/tagify.css" rel="stylesheet" type="text/css"/>
-                <link href="https://cdn.datatables.net/v/dt/jszip-3.10.1/dt-2.1.8/b-3.1.2/b-html5-3.1.2/b-print-3.1.2/fh-4.0.1/r-3.0.3/cr-2.0.4/datatables.css" rel="stylesheet"/>
-                <link href="{$basedir}/style.css" rel="stylesheet" type="text/css"/>
-                <script src="https://code.jquery.com/jquery-3.7.1.js"></script>
-                <script src="https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.9.2/semantic.min.js"></script>
-                <script src="https://cdn.jsdelivr.net/npm/@yaireo/tagify"></script>
-                <script src="https://cdn.jsdelivr.net/npm/@yaireo/tagify/dist/tagify.polyfills.min.js"></script>
-                <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.js"></script>
-                <script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script>
-                <script src="https://cdn.datatables.net/v/dt/jszip-3.10.1/dt-2.1.8/b-3.1.2/b-html5-3.1.2/b-print-3.1.2/fh-4.0.1/r-3.0.3/cr-2.0.4/datatables.js"></script>
-            </head>
+            <xsl:apply-templates select="." mode="head">
+                <xsl:with-param name="basedir" select="$basedir"/>
+                <xsl:with-param name="targets" select="$targets"/>
+                <xsl:with-param name="nextCompareWith" select="$nextCompareWith"/>
+                <xsl:with-param name="refreshPeriod" select="$refreshPeriod"/>
+                <xsl:with-param name="sudo" select="$sudo"/>
+            </xsl:apply-templates>
 
             <body>
                 <nav class="ui inverted teal fixed menu">
@@ -146,10 +113,6 @@ table.order([1, 'asc']).draw()
 
 $('.ui.dropdown').dropdown()
 
-<xsl:apply-templates select="runstats">
-    <xsl:with-param name="init" select="$init"/>
-</xsl:apply-templates>
-
 hiddenButton.onclick = function(event) {
     if (lanScanForm.checkValidity()) {
         targetsInputDiv.classList.add('loading')
@@ -190,6 +153,10 @@ function hostScanning(link) {
     })
 }
                 </script>
+
+                <xsl:apply-templates select="runstats">
+                    <xsl:with-param name="init" select="$init"/>
+                </xsl:apply-templates>
             </body>
         </html>
     </xsl:template>