#Region " Access control / user management"

  Private Shared _UnauthorizedUserToken As New UserToken("(neautorizovaný)", "---", Nothing)
  Private Shared _UserToken As UserToken = _UnauthorizedUserToken

  Public Shared ReadOnly Property User() As UserToken
    Get
      Return _UserToken
    End Get
  End Property


  Public Shared Function LogonUser(ByVal logon As String, ByVal password As String) As Boolean
    Dim Cmd As New SqlCommand("ENVI_LaMarvin_LookupUser", App.Connection)
    Cmd.CommandType = CommandType.StoredProcedure
    Cmd.Parameters.Add("@UserAccount", logon)

    Dim PwdParam As SqlParameter = Cmd.Parameters.Add("@UserPassword", password)
    If (password Is Nothing) OrElse (password.Length = 0) Then
      PwdParam.Value = DBNull.Value
    End If

    Dim UserTable As DataTable = App.ExecuteStoredProcedure(Cmd).Tables(0)
    If UserTable.Rows.Count = 0 Then
      ' Taky user tam nie je.
      _UserToken = _UnauthorizedUserToken
      Return False
    Else
      With UserTable.Rows(0)
        _UserToken = New UserToken(CStr(.Item("UserName")), CStr(.Item("UserCode")), CStr(.Item("UserToken")))
      End With
      Return True
    End If
  End Function


  Public Class UserToken

    Private _Name, _Code, _Token As String

    Private Const MinTokenLength As Integer = 6

    Public Sub New(ByVal name As String, ByVal code As String, ByVal token As String)
      _Name = Coalesce(name)
      _Code = Coalesce(code)
      _Token = Coalesce(token)
    End Sub


    Public ReadOnly Property Name() As String
      Get
        Return _Name
      End Get
    End Property


    Public ReadOnly Property Code() As String
      Get
        Return _Code
      End Get
    End Property


    Public Overrides Function ToString() As String
      Return String.Format("{0} ({1})", _Name, _Code)
    End Function


    Public ReadOnly Property NoAccess() As Boolean
      Get
        Return (_Token.Length < MinTokenLength)
      End Get
    End Property


    Public ReadOnly Property CanModifyDataAttributes() As Boolean
      Get
        Return (_Token.Length >= MinTokenLength) AndAlso _
         ((_Token.Chars(MinTokenLength - 1) = "1"c) Or (_Token.Chars(MinTokenLength - 1) = "2"c))
      End Get
    End Property


    Public ReadOnly Property CanModifyDataValues() As Boolean
      Get
        Return (_Token.Length >= MinTokenLength) AndAlso (_Token.Chars(MinTokenLength - 1) = "1"c)
      End Get
    End Property


    Private Function Coalesce(ByVal s As String) As String
      If s Is Nothing Then
        Return String.Empty
      Else
        Return s
      End If
    End Function

  End Class

#End Region