diff --git a/GPW_Admin/WebUserControls/cmp_footer.ascx b/GPW_Admin/WebUserControls/cmp_footer.ascx
new file mode 100644
index 0000000..351d7d3
--- /dev/null
+++ b/GPW_Admin/WebUserControls/cmp_footer.ascx
@@ -0,0 +1,18 @@
+<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="cmp_footer.ascx.cs" Inherits="GPW_Admin.WebUserControls.cmp_footer" %>
+
\ No newline at end of file
diff --git a/GPW_Admin/WebUserControls/cmp_footer.ascx.cs b/GPW_Admin/WebUserControls/cmp_footer.ascx.cs
new file mode 100644
index 0000000..54a578c
--- /dev/null
+++ b/GPW_Admin/WebUserControls/cmp_footer.ascx.cs
@@ -0,0 +1,60 @@
+using SteamWare;
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Linq;
+using System.Web;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+namespace GPW_Admin.WebUserControls
+{
+ public partial class cmp_footer : BaseUserControl
+ {
+ #region Public Events
+
+ public event EventHandler eh_doRefresh;
+
+ #endregion Public Events
+
+ #region Private Methods
+
+ private void setClock()
+ {
+ lblDateTime.Text = DateTime.Now.ToString("ddd dd.MM.yyyy, HH:mm:ss");
+ lblCodOperatore.Text = $"{user_std.UtSn.CognomeNome} ({Page.User.Identity.Name})";
+ }
+
+ ///
+ /// imposta il tempo di scadenza del timer x il refresh della pagina (della parte top) per evitare che la sessione sul server scada
+ ///
+ private void setTimer()
+ {
+ Timer1.Interval = SteamWare.memLayer.ML.confReadInt("intUpdatePagina_ms");
+ }
+
+ #endregion Private Methods
+
+ #region Protected Methods
+
+ protected void Page_Load(object sender, EventArgs e)
+ {
+ // sistemo le stringhe...
+ lblApp.Text = string.Format("{0} v.{1}", ConfigurationManager.AppSettings.Get("appName"), System.Reflection.Assembly.GetExecutingAssembly().GetName().Version);
+ setTimer();
+ setClock();
+ }
+
+ protected void Timer1_Tick(object sender, EventArgs e)
+ {
+ setClock();
+ // se qualcuno ascolta sollevo evento nuovo valore...
+ if (eh_doRefresh != null)
+ {
+ eh_doRefresh(this, new EventArgs());
+ }
+ }
+
+ #endregion Protected Methods
+ }
+}
\ No newline at end of file
diff --git a/GPW_Admin/WebUserControls/cmp_footer.ascx.designer.cs b/GPW_Admin/WebUserControls/cmp_footer.ascx.designer.cs
new file mode 100644
index 0000000..f86543a
--- /dev/null
+++ b/GPW_Admin/WebUserControls/cmp_footer.ascx.designer.cs
@@ -0,0 +1,53 @@
+//------------------------------------------------------------------------------
+//
+// Codice generato da uno strumento.
+//
+// Le modifiche a questo file possono causare un comportamento non corretto e verranno perse se
+// il codice viene rigenerato.
+//
+//------------------------------------------------------------------------------
+
+namespace GPW_Admin.WebUserControls
+{
+
+
+ public partial class cmp_footer
+ {
+
+ ///
+ /// Controllo lblDateTime.
+ ///
+ ///
+ /// Campo generato automaticamente.
+ /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
+ ///
+ protected global::System.Web.UI.WebControls.Label lblDateTime;
+
+ ///
+ /// Controllo lblCodOperatore.
+ ///
+ ///
+ /// Campo generato automaticamente.
+ /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
+ ///
+ protected global::System.Web.UI.WebControls.Label lblCodOperatore;
+
+ ///
+ /// Controllo lblApp.
+ ///
+ ///
+ /// Campo generato automaticamente.
+ /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
+ ///
+ protected global::System.Web.UI.WebControls.Label lblApp;
+
+ ///
+ /// Controllo Timer1.
+ ///
+ ///
+ /// Campo generato automaticamente.
+ /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
+ ///
+ protected global::System.Web.UI.Timer Timer1;
+ }
+}
diff --git a/GPW_Admin/WebUserControls/cmp_menuTop.ascx b/GPW_Admin/WebUserControls/cmp_menuTop.ascx
new file mode 100644
index 0000000..9c2201d
--- /dev/null
+++ b/GPW_Admin/WebUserControls/cmp_menuTop.ascx
@@ -0,0 +1,52 @@
+<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="cmp_menuTop.ascx.cs" Inherits="GPW_Admin.WebUserControls.cmp_menuTop" %>
+
+
+
\ No newline at end of file
diff --git a/GPW_Admin/WebUserControls/cmp_menuTop.ascx.cs b/GPW_Admin/WebUserControls/cmp_menuTop.ascx.cs
new file mode 100644
index 0000000..1fccf80
--- /dev/null
+++ b/GPW_Admin/WebUserControls/cmp_menuTop.ascx.cs
@@ -0,0 +1,176 @@
+using SteamWare;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Web;
+using System.Web.UI;
+using System.Web.UI.WebControls;
+
+namespace GPW_Admin.WebUserControls
+{
+ public partial class cmp_menuTop : BaseUserControl
+ {
+ #region Public Events
+
+ public event EventHandler eh_doRefresh;
+
+ #endregion Public Events
+
+ #region Protected Properties
+
+ ///
+ /// Valore ricerca attivo
+ ///
+ protected string searchVal
+ {
+ get
+ {
+ return txtSearch.Text.Trim();
+ }
+ set
+ {
+ txtSearch.Text = value.Trim();
+ }
+ }
+
+ #endregion Protected Properties
+
+ #region Public Properties
+
+ ///
+ /// Abilitazione esecuzione anonima
+ ///
+ public bool enableAnonym
+ {
+ get
+ {
+ bool answ = false;
+ bool.TryParse(hfAnonym.Value, out answ);
+ return answ;
+ }
+ set
+ {
+ hfAnonym.Value = value.ToString();
+ }
+ }
+
+ ///
+ /// imposta visibilità search globale
+ ///
+ public bool showSearch
+ {
+ get
+ {
+ return divSearch.Visible;
+ }
+ set
+ {
+ divSearch.Visible = value;
+ }
+ }
+
+ #endregion Public Properties
+
+ #region Private Methods
+
+ private void checkAuth()
+ {
+ // in primis SOLO SE non è permesso login anonymous...
+ if (!enableAnonym)
+ {
+ if (!Page.User.Identity.IsAuthenticated)
+ {
+ Response.Redirect("default");
+ }
+ }
+ }
+
+ private void doSearch()
+ {
+ // se searchVal !=""
+ if (!string.IsNullOrEmpty(searchVal))
+ {
+ memLayer.ML.setSessionVal("valoreSearch", searchVal);
+ }
+ else
+ {
+ memLayer.ML.emptySessionVal("valoreSearch");
+ }
+ // se qualcuno ascolta sollevo evento nuovo valore...
+ if (eh_doRefresh != null)
+ {
+ eh_doRefresh(this, new EventArgs());
+ }
+ }
+
+ ///
+ /// aggiornamento del menù
+ ///
+ private void updateTreeMenu()
+ {
+ // SOLO SE è permesso login anonymous --> nascondo menù!
+ if (enableAnonym)
+ {
+ menu.Visible = false;
+ }
+ else
+ {
+ try
+ {
+ if (string.IsNullOrEmpty(user_std.UtSn.mappaSito))
+ {
+ Response.Redirect("Default", true);
+ }
+ XmlMenu.Data = user_std.UtSn.mappaSito;
+ XmlMenu.XPath = "mainMenu/menu";
+ XmlMenu.DataBind();
+ }
+ catch
+ {
+ Response.Redirect("default", true);
+ }
+ }
+ }
+
+ #endregion Private Methods
+
+ #region Protected Methods
+
+ ///
+ /// click su pagina corrente, fa update!
+ ///
+ ///
+ ///
+ protected void lbnUpdate_Click(object sender, EventArgs e)
+ {
+ // SOLO SE non è permesso login anonymous...
+ if (!enableAnonym)
+ {
+ Response.Redirect("default");
+ }
+ }
+
+ protected void lbtSearch_Click(object sender, EventArgs e)
+ {
+ doSearch();
+ }
+
+ protected void Page_Load(object sender, EventArgs e)
+ {
+ if (!Page.IsPostBack)
+ {
+ checkAuth();
+ searchVal = "";
+ doSearch();
+ updateTreeMenu();
+ }
+ }
+
+ protected void txtSearch_TextChanged(object sender, EventArgs e)
+ {
+ doSearch();
+ }
+
+ #endregion Protected Methods
+ }
+}
\ No newline at end of file
diff --git a/GPW_Admin/WebUserControls/cmp_menuTop.ascx.designer.cs b/GPW_Admin/WebUserControls/cmp_menuTop.ascx.designer.cs
new file mode 100644
index 0000000..3e3523c
--- /dev/null
+++ b/GPW_Admin/WebUserControls/cmp_menuTop.ascx.designer.cs
@@ -0,0 +1,71 @@
+//------------------------------------------------------------------------------
+//
+// Codice generato da uno strumento.
+//
+// Le modifiche a questo file possono causare un comportamento non corretto e verranno perse se
+// il codice viene rigenerato.
+//
+//------------------------------------------------------------------------------
+
+namespace GPW_Admin.WebUserControls
+{
+
+
+ public partial class cmp_menuTop
+ {
+
+ ///
+ /// Controllo hfAnonym.
+ ///
+ ///
+ /// Campo generato automaticamente.
+ /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
+ ///
+ protected global::System.Web.UI.WebControls.HiddenField hfAnonym;
+
+ ///
+ /// Controllo menu.
+ ///
+ ///
+ /// Campo generato automaticamente.
+ /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
+ ///
+ protected global::System.Web.UI.WebControls.Repeater menu;
+
+ ///
+ /// Controllo XmlMenu.
+ ///
+ ///
+ /// Campo generato automaticamente.
+ /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
+ ///
+ protected global::System.Web.UI.WebControls.XmlDataSource XmlMenu;
+
+ ///
+ /// Controllo divSearch.
+ ///
+ ///
+ /// Campo generato automaticamente.
+ /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
+ ///
+ protected global::System.Web.UI.HtmlControls.HtmlGenericControl divSearch;
+
+ ///
+ /// Controllo txtSearch.
+ ///
+ ///
+ /// Campo generato automaticamente.
+ /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
+ ///
+ protected global::System.Web.UI.WebControls.TextBox txtSearch;
+
+ ///
+ /// Controllo lbtSearch.
+ ///
+ ///
+ /// Campo generato automaticamente.
+ /// Per la modifica, spostare la dichiarazione di campo dal file di progettazione al file code-behind.
+ ///
+ protected global::System.Web.UI.WebControls.LinkButton lbtSearch;
+ }
+}