Option Explicit

Class clsToolbar
  Private mobjFormM, mobjFormS
  Private mobjMEs, mobjSEs
  Private mobjE
  Public FormMName
  Public FormSName
  
  Public Sub Click(Button) 
    Dim blnTest
    
    Select Case LCase(Button.Name)
      'Stisteno tlacitko pro novy zaznam
      Case LCase("cmdNew")
        'Vymaz vsechna policka a zinicializuj defaulty
        Document.Location.Href = "?cls=" & mobjSEs("cls").Value & "&" & mobjSEs("PKName").Value & "=" & vbObjectError
      'Stisteno tlacitko pro novy zaznam s predplnenim
      Case LCase("cmdNewWith")
        FormSSet False
        SetDefaultValuesForNewWith
        HideElementsWhenEdit True
        mobjSEs("action").Value = "new"
        SetRedirect
      'Stisteno tlacitko pro zmenu zaznamu
      Case LCase("cmdChange")
        FormSSet False
        HideElementsWhenEdit True
        mobjSEs("action").Value = "change"
        SetRedirect
      'Stisteno tlacitko pro potvrzeni zmeny
      Case LCase("cmdSubmit")
        'Policka, ktera jsou kvuli vzhledu nastavena pouze jako ReadOnly prevest na Disabled
        For Each mobjE In mobjSEs
          If Left(mobjE.Type, 4) = "text" Then If mobjE.ReadOnly Then mobjE.Disabled = True
        Next
        blnTest = True
        If mobjFormS.Elements("CallFormSBeforeSubmit").Value Then blnTest = FormSBeforeSubmit()
        If blnTest Then mobjFormS.Submit()
      'Stisteno tlacitko pro nepotvrzeni zmeny
      Case LCase("cmdReset")
        mobjFormS.Reset()
        FormSSet True
        HideElementsWhenEdit False
      'Stisteno tlacitko pro smazani zaznamu
      Case LCase("cmdDelete")
        If MsgBox(GS("ReallyDeleteThisRecord"), vbYesNo, GS("Delete")) = vbYes Then
          mobjSEs("action").Value = "delete"
          SetRedirect
          mobjFormS.Submit()
        End If  
      'Stisteno tlacitko pro obnovu zobrazene stranky
      Case LCase("cmdRefresh")
        Document.Location.Reload()
      'Stisteno tlacitko pro krok zpet
      Case LCase("cmdBack")
        Window.History.Go(-1)
    End Select
  End Sub
  
  Public Sub Init()
    Dim strTmp
    
    If Not IsEmpty(mobjFormM) Then Exit Sub
    Set mobjFormM = Document.Forms(Me.FormMName)
    Set mobjFormS = Document.Forms(Me.FormSName)
    Set mobjMEs = mobjFormM.Elements
    Set mobjSEs = mobjFormS.Elements
    
    'Neni-li jmeno primarniho klice, pak se jedna o vlozeni noveho zaznamu
    If CLng(mobjSEs(mobjSEs("PKName").Value).Value) = vbObjectError Then
      FormSSet False
      mobjSEs("action").Value = "new"
      SetRedirect
    Else
      FormSSet True
    End If
    
    'Automaticke vyvolani udalosti, je-li pozadovana
    strTmp = UrlItemGet(Null, "TBClick")
    If strTmp <> "" Then
      If Not (mobjMEs(strTmp) Is Nothing) Then If mobjMEs(strTmp).Type = "button" Then If Not mobjMEs(strTmp).Disabled Then mobjMEs(strTmp).Click
    End If
  End Sub
  
  Private Sub HideElementsWhenEdit(blnEdit)
    Dim strElList, objE, varItem, strVisibility
    
    strElList = mobjSEs("HideElementsWhenEdit").Value
    If blnEdit Then strVisibility = "hidden" Else strVisibility = "visible"
    
    If strElList <> "" Then
      For Each varItem In Split(strElList,",")
        Set objE = Document.GetElementById(varItem)
        If Not objE Is Nothing Then
          objE.style.visibility = strVisibility
        End If
      Next  
    End If
  End Sub
  
  'Nastavi obrazovku, policka a tlacitka k editaci
  Private Sub FormSSet(blnDisabled)
    Dim objE, strDisabledFields, blnDisabledItem
    
    strDisabledFields = "," & mobjSEs("DisabledFields").Value & ","
    
    If blnDisabled Then
      If LCase(UrlItemGet(Null, "Cls")) = "contact" Then
        mobjFormS.ParentElement.ClassName = "CNormalBil"
      ElseIf LCase(UrlItemGet(Null, "Cls")) = "helpdesk" Then
        mobjFormS.ParentElement.ClassName = "CNormalHdk"
      Else
        mobjFormS.ParentElement.ClassName = "CNormal"
      End If  
    Else
      If LCase(UrlItemGet(Null, "Cls")) = "contact" Then
        mobjFormS.ParentElement.ClassName = "CEditBil"
      ElseIf LCase(UrlItemGet(Null, "Cls")) = "helpdesk" Then
        mobjFormS.ParentElement.ClassName = "CEditHdk"
      Else
        mobjFormS.ParentElement.ClassName = "CEdit"
      End If  
    End If  
    
    'Zpristupneni/zakazani tlacitek v toolbaru
    FormMSet "cmdSubmit, cmdReset", blnDisabled
    
    'Zpristupneni policek pro editaci
    For Each objE In mobjSEs
      blnDisabledItem = blnDisabled
      If Not blnDisabledItem Then blnDisabledItem = (InStr(1, Strdisabledfields, "," & objE.Name & ",", vbTextCompare) > 0)
      Select Case objE.Type
        Case "hidden", "button"
        Case "text", "textarea"
          If blnDisabledItem Then
            objE.ReadOnly = True
            objE.Style.Color = "gray"
          Else
            objE.ReadOnly = False
            objE.Style.Color = "black"
          End If
        Case Else
          objE.Disabled = blnDisabledItem
      End Select
    Next  
  End Sub
  
  'Povoli ci zakaze tlacitka v toolbaru
  Private Sub FormMSet(strList, blnDisab)
    Dim objE, strDisabledButtons, blnDisabledItem
    
    strDisabledButtons = "," & mobjSEs("DisabledButtons").Value & ","
    If IsNull(strList) Then strList = ""
    If IsNull(blnDisab) Then blnDisab = False
    For Each objE In mobjMEs
      If InStr(1, LCase(strList), LCase(objE.Name)) > 0 Then blnDisabledItem = blnDisab Else blnDisabledItem = Not blnDisab
      If Not blnDisabledItem Then blnDisabledItem = (InStr(1, strDisabledButtons, "," & objE.Name & ",", vbTextCompare) > 0)
      objE.Disabled = blnDisabledItem
    Next  
  End Sub

  'Nastavi zakladni presmerovani
  Private Sub SetRedirect()
    mobjSEs("redirect").Value = "?cls=" & mobjSEs("cls").Value & "&" & mobjSEs("PKName").Value & "=PRIMARY_KEY"
  End Sub
  
  Private Sub SetDefaultValuesForNewWith()
    If mobjSEs("DefaultValuesForNewWith").Value <> "" Then
      Dim lngI, varArrM, varArrS, varItem
      
      varArrM = Split(mobjSEs("DefaultValuesForNewWith").Value, "&")
      For lngI = LBound(varArrM) To UBound(varArrM)
        varArrS = Split(varArrM(lngI), "=")
        'Pokud neni zasilana hodnota (neobsahuje =) davase element jako disabled
        If TypeName(mobjSEs(varArrS(0))) = "DispHTMLElementCollection" Then
          For Each varItem In mobjSEs(varArrS(0))
            If UBound(varArrS) = 0 Then
              varItem.Disabled = True
            Else
              If varItem.Value = varArrS(1) Then varItem.Checked = True
            End If
          Next
        Else
          If UBound(varArrS) = 0 Then
            mobjSEs(varArrS(0)).Disabled = True
          Else
            mobjSEs(varArrS(0)).Value = varArrS(1)
          End If        
        End If
      Next
    End If
  End Sub
End Class

Public Sub FormClear(objForm)  
  Dim objE, strV  
  For Each objE In objForm.Elements
    strV = ""
    Select Case LCase(objE.Type)
      Case "checkbox"
        If objE.Checked Then strV = objE.Value
      Case "select-one"  
        strV = objE.Options(objE.SelectedIndex).Value
      Case Else
        strV = objE.Value
    End Select    
    If strV = "" Then objE.Disabled = True
  Next
End Sub

'Vrati hodnotu polozky z QueryStringu (neni-li obsazena Empty)
Public Function URLItemGet(ByVal strURL, ByVal strItem)
  Dim TmpA, TmpB, varItem, strItemValue
  strItem = LCase(strItem)
  If IsNull(strURL) Then strURL = Document.Location.Search
  TmpA = Split(strURL, "?")
  strURL = TmpA(UBound(TmpA))
  TmpA = Split(strURL, "#")
  strURL = TmpA(LBound(TmpA))
  If strURL = "" Then Exit Function
  
  TmpA = Split(strURL, "&")
  For Each varItem In TmpA
    TmpB = Split(varItem, "=")
    If LCase(TmpB(LBound(TmpB))) = strItem Then
      strItemValue = "" & strItemValue
      If LBound(TmpB) <> UBound(TmpB) Then
        If strItemValue <> "" Then strItemValue = strItemValue & ", "
        strItemValue = strItemValue & TmpB(UBound(TmpB))
      End If
    End If
  Next
  URLItemGet = strItemValue
End Function

'Pokusi se na strance nalezt pozadovany element (prochazi vsechny formy)
'Nalezne-li vrati Nothing
Public Function FormElementGet(ByVal strName, ByVal strType)
  strName = LCase(strName)
  strType = LCase("" & strType)
  Dim objF, objE
  For Each objF In Document.Forms
    For Each objE In objF.Elements
      If objE.Type = strType Or strType = "" Then
        If LCase(objE.Name) = strName Then
            Set FormElementGet = objE
            Exit Function
        End If
      End If
    Next
  Next
  Set FormElementGet = Nothing
End Function

'Naformatuje datum dle specifikovane masky
Public Function FrmtDate(dtm, ByVal strMask)
  Dim strPart
  If IsDate(dtm) Then
    strPart = Year(dtm)
    strMask = Replace(strMask, "YYYY", strPart, 1, 1, vbTextCompare)
    strMask = Replace(strMask, "YY", Right(strPart, 2), 1, 1, vbTextCompare)
    strPart = Month(dtm)
    strMask = Replace(strMask, "MM", Right(0 & strPart, 2), 1, 1, vbTextCompare)
    strMask = Replace(strMask, "M", strPart, 1, 1, vbTextCompare)
    strPart = Day(dtm)
    strMask = Replace(strMask, "DD", Right(0 & strPart, 2), 1, 1, vbTextCompare)
    strMask = Replace(strMask, "D", strPart, 1, 1, vbTextCompare)
    strPart = Hour(dtm)
    strMask = Replace(strMask, "HH", Right(0 & strPart, 2), 1, 1, vbTextCompare)
    strMask = Replace(strMask, "H", strPart, 1, 1, vbTextCompare)
    strPart = Minute(dtm)
    strMask = Replace(strMask, "NN", Right(0 & strPart, 2), 1, 1, vbTextCompare)
    strMask = Replace(strMask, "N", strPart, 1, 1, vbTextCompare)
    strPart = Second(dtm)
    strMask = Replace(strMask, "SS", Right(0 & strPart, 2), 1, 1, vbTextCompare)
    strMask = Replace(strMask, "S", strPart, 1, 1, vbTextCompare)
    FrmtDate = strMask
  End If
End Function

'Vrati text ze selectu na zaklade vybrane hodnoty
'Nelokalizuje-li select, ci jeho hodnotu vrati pouze strSelectValue
Public Function SelectValueGet(ByVal strName, varValue)
  Dim objE, objO
  
  Set objE = FormElementGet(strName, "select-one")
  If Not objE Is Nothing Then
    For Each objO In objE.Options
      If objO.Value = varValue Then
        SelectValueGet = "'" & objO.Text & "'"
        Exit Function
      End If
    Next
  End If  
  'Pokud hodnota neni lokalizovana zobrazit, alespon id hodnoty
  SelectValueGet = varValue
End Function

'Nalezne-li button s pozadovanym nazvem zavola na nem click
Public Sub CmdClick(ByVal strName)
  Dim objE
  Set objE = FormElementGet(strName, "button")
  If Not objE Is Nothing Then If Not objE.Disabled Then objE.Click
End Sub

'Globalni zachytavani klaves
'Private Sub Document_OnKeyDown()
'  Dim strName
'  
'  If Window.Event.CtrlKey Then
'    Select Case Chr(Window.Event.KeyCode)
'      Case "N": strName = "cmdNew" 
'      Case "S": strName = "cmdSubmit"
'    End Select
'  End If
'  If strName <> "" Then
'    CmdClick strName
'    Window.Event.ReturnValue = Null
'  End If
'End Sub
