using GMW_data;
using SteamWare;
using System;
using System.Collections.Generic;
using System.Web.UI;

public partial class mod_menuTop : ApplicationUserControl
{
  private string _titleString;

  #region gestione eventi

  public event EventHandler eh_toggleMenuSx;
  public event EventHandler eh_reqUpdateMenu;

  #endregion

  /// <summary>
  /// indica name della postazione corrente
  /// </summary>
  protected string postazione_name
  {
    get
    {
      return memLayer.ML.StringSessionObj("postazione_name");
    }
    set
    {
      memLayer.ML.setSessionVal("postazione_name", value);
    }
  }
  /// <summary>
  /// indica ip della postazione corrente
  /// </summary>
  protected string postazione_IP
  {
    get
    {
      return memLayer.ML.StringSessionObj("postazione_IP");
    }
    set
    {
      memLayer.ML.setSessionVal("postazione_IP", value);
    }
  }
  /// <summary>
  /// indica stampante associata alla postazione corrente
  /// </summary>
  protected string postazione_printer
  {
    get
    {
      return memLayer.ML.StringSessionObj("postazione_printer");
    }
    set
    {
      memLayer.ML.setSessionVal("postazione_printer", value);
    }
  }
  /// <summary>
  /// calcola postazione corrente (ip, name, printer)
  /// </summary>
  private void calcolaPostazione()
  {
    postazione_IP = Request.UserHostName;
    postazione_name = dnsUtils.DetermineCompName(postazione_IP);
    // cerco stampante x postazione
    postazione_printer = "n.d.";
    try
    {
      DS_Applicazione.ElencoPostazioniDataTable tabPost = DataProxy.obj.taElPost.getByCod(postazione_name);
      if (tabPost.Rows.Count > 0)
      {
        postazione_printer = tabPost[0].stampante;
      }
    }
    catch
    { }
    // mostro warning se postazione non configurata...
    if (postazione_printer == "n.d.")
    {
      // cambio css x mostrare errore sstampante non configurata!
      lblPrinter.CssClass = "erroreMidYellow";
      lblPrinter.Font.Bold = true;
    }
  }
  /// <summary>
  /// caricamento pagina
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  protected override void Page_Load(object sender, EventArgs e)
  {
    base.Page_Load(sender, e);
    btnLogOut.Visible = user_std.UtSn.isForcedUser;
    if (memLayer.ML.isInSessionObject("doUpdateNow"))
    {
      doFullDataUpdate();
      memLayer.ML.emptySessionVal("doUpdateNow");
    }
    if (!Page.IsPostBack)
    {
      calcolaPostazione();
      showPostazione();
    }
  }
  /// <summary>
  /// mostra dati postazioni
  /// </summary>
  private void showPostazione()
  {
    lblPostazione.Text = string.Format("{2}: {0} ({1})", postazione_name, postazione_IP, traduci("postazione"));
    lblPrinter.Text = string.Format("{1}: {0}", postazione_printer, traduci("stampante"));
  }

  protected void btnLogOut_Click(object sender, EventArgs e)
  {
    Session.Abandon();
    Response.Redirect("forceUser.aspx");
  }
  protected void btnUpdate_Click(object sender, EventArgs e)
  {
    doFullDataUpdate();
  }

  private void doFullDataUpdate()
  {
    // salvo i dati attuali...
    string cod_cdc = SteamWare.memLayer.ML.StringSessionObj("valRicercaCdC");
    string lingua = user_std.UtSn.lingua;
    string USER_NAME = SteamWare.memLayer.ML.StringSessionObj("USER_NAME");
    string DOMINIO = SteamWare.memLayer.ML.StringSessionObj("DOMINIO");
    bool isForceUser = user_std.UtSn.isForcedUser;
    // salvo i valori delle tab in session...
    Dictionary<string, string> sessionParam = SteamWare.memLayer.ML.valSess2SurvUpd;

    // svuoto session e cache per rileggere i dati da Db
    Session.RemoveAll();

    SteamWare.memLayer.ML.flushRegisteredCache();

    // rimemorizzo
    SteamWare.memLayer.ML.setSessionVal("valRicercaCdC", cod_cdc);
    user_std.UtSn.startUpUtente(DOMINIO, USER_NAME);
    user_std.UtSn.lingua = lingua;
    user_std.UtSn.isForcedUser = isForceUser;
    DataWrap.DW.resetVocabolario();

    // risalvo in session i valori...
    foreach (KeyValuePair<string, string> kvp in sessionParam)
    {
      SteamWare.memLayer.ML.setSessionVal(kvp.Key, kvp.Value, true);
    }

    // cambio visibilità del menù laterale...
    if (eh_reqUpdateMenu != null)
    {
      eh_reqUpdateMenu(this, new EventArgs());
    }

    Response.Redirect(_paginaCorrente);
  }

  protected override void loadSessionData()
  {
    base.loadSessionData();
    _titleString = SteamWare.memLayer.ML.StringSessionObj("_titleString");
  }

  protected override void bindControlli()
  {
    if (!Page.IsPostBack)
    {
      lnkHelp.ToolTip = traduci("ApriManualeHelp");
      // solo se user è auth...
      if (user_std.UtSn.isAuth)
      {
        lnkShowHide.Text = user_std.UtSn.Traduci("lnkShowHide");
        lblTitle.Text = SteamWare.memLayer.ML.confReadString("titleApp");
        if (_titleString != "")
        {
          // traduzione di tutti i termini
          lblMessUtente.Text = user_std.UtSn.Traduci(_titleString);
          //doppio in english!
          lblMessUtenteEn.Text = "(" + user_std.UtSn.TraduciEn(_titleString) + ")";
          _titleString = "";
          Session["_titleString"] = _titleString;
          Session["SessionUpdateMenu"] = true;
        }
        else
        {
          string titolo = user_std.UtSn.Traduci("GMW_welcomeApp");
          lblMessUtente.Text = string.Format("{0} - {1}", titolo, memLayer.ML.confReadString("SiteName"));
          lblMessUtenteEn.Text = "";
          Session["SessionUpdateMenu"] = false;
        }
        btnLogOut.Text = user_std.UtSn.Traduci("LogOut");
        btnUpdate.Text = user_std.UtSn.Traduci("Update");
        lblUser.Text = String.Format("{0}: {1}", user_std.UtSn.Traduci("User"), user_std.UtSn.CognomeNome);
        setTimer();
        setClock();
      }
    }
  }
  /// <summary>
  /// imposta il tempo di scadenza del timer x il refresh della pagina (della parte top) per evitare che la sessione sul server scada
  /// </summary>
  private void setTimer()
  {
    Timer1.Interval = SteamWare.memLayer.ML.confReadInt("intUpdatePagina_ms");
  }
  protected void lnkShowHide_Click(object sender, EventArgs e)
  {
    // cambio visibilità del menù laterale...
    if (eh_toggleMenuSx != null)
    {
      eh_toggleMenuSx(this, new EventArgs());
    }

  }
  protected void Timer1_Tick(object sender, EventArgs e)
  {
    setClock();
  }

  private void setClock()
  {
    lblDateTime.Text = DateTime.Now.ToString("HH:mm:ss");
  }
  protected void lblUser_Click(object sender, EventArgs e)
  {
    Response.Redirect("./chLang.aspx");
  }
}
