#include <file.au3>
#include <array.au3>
#include <String.au3>
#include <GUIConstants.au3>
#Include <GuiList.au3>
Opt("GUIOnEventMode", 1)
Global Const $WM_COMMAND = 0x0111
Global Const $WM_NOTIFY = 0x004E
Global Const $NM_FIRST = 0
Global Const $NM_LAST = (-99)
Global Const $NM_CLICK = ($NM_FIRST - 2)
Global Const $NM_DBLCLK = ($NM_FIRST - 3)
Global Const $NM_RCLICK = ($NM_FIRST - 5)
Global Const $NM_RDBLCLK = ($NM_FIRST - 6)
Dim $listPath = 'trans_list.txt', $arTAN, $arErfass[1]
Dim $neu = 0, $Salmon = 0xFA8072, $PaleGreen = 0x98FB98													

; TAN-Erfassung GUI
$TanErfass = GUICreate("TAN - Liste erfassen", 257, 424, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "TanErfassClose")
$Label1 = GUICtrlCreateLabel("TAN - Listen - Nr.:", 16, 16, 89, 17)
$inListNr = GUICtrlCreateInput("", 109, 13, 121, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL))
$Group1 = GUICtrlCreateGroup(" TAN ", 16, 44, 217, 329)
$lstTAN = GUICtrlCreateList('0', 25, 59, 200, 305, BitOR($WS_VSCROLL,$WS_BORDER))
$mnu = GUICtrlCreateContextMenu($lstTAN)
$itemChange = GUICtrlCreateMenuItem('Ändern', $mnu)
GUICtrlSetOnEvent(-1, 'changeTAN')
$itemDelete = GUICtrlCreateMenuItem('Löschen', $mnu)
GUICtrlSetOnEvent(-1, 'deleteTAN')
GUICtrlCreateGroup("", -99, -99, 1, 1)
$bSave = GUICtrlCreateButton("Verschlüsseln && Speichern", 16, 390, 217, 22, 0)
GUICtrlSetOnEvent(-1, 'bSaveClick')
; /TAN-Erfassung GUI
; Main GUI
$Form1 = GUICreate("TAN - Verwaltung", 667, 363, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "AForm1Close")
$ListView1 = GUICtrlCreateListView("lfd. Nr.|TAN|Datum|Verwendungszweck", 16, 34, 636, 289, $LVS_NOSORTHEADER, _
			BitOR($LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT))
_GUICtrlListViewSetColumnWidth(-1, 0, 50)
_GUICtrlListViewSetColumnWidth(-1, 1, 190)
_GUICtrlListViewSetColumnWidth(-1, 2, 100)
_GUICtrlListViewSetColumnWidth(-1, 3, 290)
_GUICtrlListViewJustifyColumn(-1, 0, 1) 
_GUICtrlListViewJustifyColumn(-1, 1, 2)
_GUICtrlListViewJustifyColumn(-1, 2, 2)
_GUICtrlListViewJustifyColumn(-1, 3, 0)
$Label1 = GUICtrlCreateLabel("TAN - Listen - Nr.:", 220, 9, 89, 17)
$ListenNr = GUICtrlCreateInput("", 316, 6, 129, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL,$ES_READONLY))
$Label2 = GUICtrlCreateLabel("Anzahl freier TAN:", 16, 9, 90, 17)
$freeTAN = GUICtrlCreateInput("", 110, 6, 33, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL,$ES_READONLY))
$bTANneu = GUICtrlCreateButton('TAN - Liste erfassen', 502, 6, 150, 21)
GUICtrlSetOnEvent(-1, "bTANneuClick")
$Label3 = GUICtrlCreateLabel("TAN auswählen mit Doppelklick  -  Dechiffrierung und Übergabe an Zwischenablage nach Paßwort-Abfrage", 16, 336, 636, 17, $SS_CENTER)
; /Main GUI

If _FileReadToArray($listPath, $arTAN) = 0 Then
	If MsgBox(262180, 'FEHLER!', 'TAN - Liste konnte nicht geladen werden.' & @LF & 'Datei: ' & $listPath & ' nicht gefunden.' & @LF & _
	'Wenn die TAN - Liste bereits angelegt wurde,' & @LF  & _
	'muß die Datei sich im selben Verzeichnis,' & @LF  & _
	'wie dieses Programm befinden.' & @LF & @LF & _
	'Wollen Sie jetzt eine TAN - Liste erfassen?') = 6 Then
		bTANneuClick()
		$neu = 1
	Else
		Exit
	EndIf
EndIf

If $neu = 0 Then 
	_ArrayDelete($arTAN, 0)
	GUISetState(@SW_SHOW, $Form1)
	_writeListView()
EndIf
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")

While 1
	Sleep(100)
WEnd
		
Func AForm1Close()
	Exit
EndFunc

Func TanErfassClose()
	If (Not FileExists($listPath)) Then
		MsgBox(0, 'FEHLER!', 'Es wurde noch keine TAN-Liste angelegt!' & @LF & 'Das Programm wird beendet.')
		Exit
	EndIf
	GUISetState(@SW_SHOW, $Form1)
	GUISetState(@SW_HIDE, $TanErfass)
EndFunc


Func ListViewDoubleClick()
	$idx = _GUICtrlListViewGetSelectedIndices($ListView1)
	If String(_GUICtrlListViewGetItemText($ListView1, $idx, 2)) <> '0' Then
		MsgBox(0, 'ACHTUNG!', 'Diese TAN wurde bereits verwendet.')
		Return
	EndIf
	If MsgBox(262180, 'TAN abrufen', 'Wollen Sie die TAN mit der' & @LF & 'lfd. Nr.: ' & $idx+1 & @LF & 'jetzt verwenden ?') = 7 Then Return
	Local $arReplace[4]=[3,_GUICtrlListViewGetItemText($ListView1, $idx, 1), @MDAY&'.'&@MON&'.'&@YEAR, _
						InputBox('Verwendungszweck', 'Bitte geben Sie den Verwendungszweck ein')]
	$arTAN[$idx+2] = $arReplace
	_writeFromArrayTAN()
	ClipPut( _StringEncrypt(0, _GUICtrlListViewGetItemText($ListView1, $idx, 1), _
		InputBox('Paßwort Entschlüsselung', 'Bitte jetzt das Paßwort zur Entschlüsselung eingeben.', '', '•')))
	MsgBox(0, 'Zwischenablage', 'Die TAN wurde in die Zwischenablage eingefügt.')
	_GUICtrlListViewDeleteAllItems($ListView1)
	_FileReadToArray($listPath, $arTAN)
	_ArrayDelete($arTAN, 0)
	_writeListView()
EndFunc

Func _writeFromArrayTAN()
	Local $arTmp[UBound($arTAN)]
	$arTmp[0] = $arTAN[0]
	$arTmp[1] = $arTAN[1]
	For $i = 2 To UBound($arTAN)-1
		$arTmp[$i] = 	_SubArrayGetEntry($arTAN, 1, $i) & ';' & _
						_SubArrayGetEntry($arTAN, 2, $i) & ';' & _
						_SubArrayGetEntry($arTAN, 3, $i)
	Next
	If FileExists($listPath) Then FileMove($listPath, $listPath & '.BAK')
	_FileWriteFromArray($listPath, $arTmp)
EndFunc
		
Func bTANneuClick()
	If FileExists($listPath) Then MsgBox(0, 'HINWEIS', 'Nach dem Erfassen einer neuen TAN - Liste' & @LF & _
	'kann auf die bisherige Liste nicht mehr zugegriffen werden.' & @LF & _
	'Sie wird unter dem Namen: ' & $listPath & '.BAK im Programmverzeichnis abgelegt.')
	GUISetState(@SW_HIDE, $Form1)
	GUISetState(@SW_SHOW, $TanErfass)
	SplashTextOn('TAN - Nummern eingeben', @LF & '    Um die Erfassung der TAN - Nummern zu aktivieren,' & @LF & _
				'    bitte einen Doppelklick in die Liste ausführen' & @LF & _
				'    Um das Eingabefenster zu schließen, bei leerem Eingabefeld OK klicken.' & @LF & _
				'    Per Rechtsklick auf einen markierten Eintrag kann dieser:' & @LF & _
				'    - geändert oder' & @LF & _
				'    - gelöscht werden.', 550, 150, -1, -1, 4)
	Sleep(12000)
	SplashOff()
EndFunc

Func _writeListView()
	Local $free = 0, $arLV[UBound($arTAN)-2]
	GUICtrlSetData($ListenNr, $arTAN[0])
	For $i = 2 To UBound($arTAN)-1
		$arTAN[$i] = StringSplit($arTAN[$i], ';')
		$arLV[$i-2] = GUICtrlCreateListViewItem($i-1 & '|' & _SubArrayGetEntry($arTAN, 1, $i) _
													 & '|' & _SubArrayGetEntry($arTAN, 2, $i) _
													 & '|' & _SubArrayGetEntry($arTAN, 3, $i), $ListView1)
		If _SubArrayGetEntry($arTAN, 2, $i) = 0 Then 
			$free += 1
			GUICtrlSetBkColor($arLV[$i-2], $PaleGreen)
		Else
			GUICtrlSetBkColor($arLV[$i-2], $Salmon)
		EndIf
	Next
	GUICtrlSetData($freeTAN, $free)
EndFunc

Func List_DoubleClick()
	$TAN = InputBox('TAN - Erfassung', 'Bitte hier die TAN eingeben')
	If $TAN <> '' Then
		_GUICtrlListAddItem($lstTAN, $TAN)
		_GUICtrlListReplaceString($lstTAN, 0, String(_GUICtrlListCount($lstTAN)-1))
	Else
		Return
	EndIf
	List_DoubleClick()
EndFunc

Func changeTAN()
	$idx = _GUICtrlListGetCaretIndex($lstTAN)
	$new = InputBox('TAN - Erfassung', 'Bitte korrigieren', _GUICtrlListGetText($lstTAN, $idx))
	If $new <> '' Then _GUICtrlListReplaceString($lstTAN, $idx, String($new))
EndFunc

Func deleteTAN()
	$idx = _GUICtrlListGetCaretIndex($lstTAN)
	If MsgBox(262180, 'Löschen', 'Soll:'  & @LF &  _GUICtrlListGetText($lstTAN, $idx)  & @LF &  'wirklich gelöscht werden?') = 6 Then
		_GUICtrlListDeleteItem($lstTAN, $idx)
		_GUICtrlListReplaceString($lstTAN, 0, String(_GUICtrlListCount($lstTAN)-1))
	EndIf
EndFunc

Func bSaveClick()
	$listNr = GUICtrlRead($inListNr)
	If $listNr = '' Then
		MsgBox(0, '', 'Listen-Nr. wurde nicht erfaßt!')
		Return
	EndIf
	$anz = _GUICtrlListCount($lstTAN)
	If $anz < 2 Then
		MsgBox(0, '', 'Keine TAN-Nr. erfaßt!')
		Return
	EndIf
	ReDim $arErfass[$anz+1]
	$arErfass[0] = $listNr
	$arErfass[1] = $anz
	$KEY = InputBox('Paßwort Verschlüsselung', 'Bitte jetzt das Paßwort zur Verschlüsselung eingeben.', '', '•')
	For $i = 1 To $anz-1
		$arErfass[$i+1] = _StringEncrypt(1, _GUICtrlListGetText($lstTAN, $i), $KEY) & ';0;'
	Next
	If FileExists($listPath) Then FileMove($listPath, $listPath & '.BAK', 1)
	_FileWriteFromArray($listPath, $arErfass)
	_GUICtrlListViewDeleteAllItems($ListView1)
	_FileReadToArray($listPath, $arTAN)
	_ArrayDelete($arTAN, 0)
	TanErfassClose()
	_writeListView()
EndFunc

Func _SubArrayGetEntry($ARRAY, $SubIdx, $iDim1, $iDim2=-1)
	If (Not IsArray($ARRAY)) Then
		SetError(1)
		Return 0
	EndIf
	If ($iDim1 < 0) Or ($iDim1 > UBound($ARRAY)-1) Then
		SetError(2)
		Return 0
	EndIf
	Local $UbSecond = UBound($ARRAY, 2)
	If @error Then
		If $iDim2 <> -1 Then
			SetError(3)
			Return 0
		EndIf
	ElseIf ($iDim2 < -1) Or ($iDim2 > $UbSecond-1) Then
		SetError(2)
		Return 0
	EndIf
	Local $sub
	Switch $iDim2
		Case -1
			$arSub = $ARRAY[$iDim1]
		Case Else
			$arSub = $ARRAY[$iDim1][$iDim2]
	EndSwitch	
	If ($SubIdx < 0) Or ($SubIdx > UBound($arSub)-1) Then
		SetError(4)
		Return 0
	Else
		Return $arSub[$SubIdx]
	EndIf
EndFunc  

Func MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
    Local $nNotifyCode = BitShift($wParam, 16)
    Local $nID = BitAND($wParam, 0xFFFF)
    Local $hCtrl = $lParam
    Local Const $LBN_ERRSPACE = (-2);
    Local Const $LBN_SELCHANGE = 1;
    Local Const $LBN_DBLCLK = 2;
    Local Const $LBN_SELCANCEL = 3;
    Local Const $LBN_SETFOCUS = 4;
    Local Const $LBN_KILLFOCUS = 5;

    Switch $nID
        Case $lstTAN
            Switch $nNotifyCode
                Case $LBN_ERRSPACE
;~                     _DebugPrint("$LBN_ERRSPACE")
                Case $LBN_SELCHANGE
;~                     _DebugPrint("$LBN_SELCHANGE")
                Case $LBN_SELCANCEL
;~                     _DebugPrint("$LBN_SELCANCEL")
                Case $LBN_SETFOCUS
;~                     _DebugPrint("$LBN_SETFOCUS")
                Case $LBN_KILLFOCUS
;~                     _DebugPrint("$LBN_KILLFOCUS")
                Case $LBN_DBLCLK
                    List_DoubleClick()
            EndSwitch
    EndSwitch
    ; Proceed the default Autoit3 internal message commands.
    ; You also can complete let the line out.
    ; !!! But only 'Return' (without any value) will not proceed
    ; the default Autoit3-message in the future !!!
    Return $GUI_RUNDEFMSG
EndFunc   ;==>MY_WM_COMMAND

Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
    ;#forceref $hWndGUI, $MsgID, $wParam
     Local $tagNMHDR, $event, $hwndFrom, $code
     $tagNMHDR = DllStructCreate("int;int;int", $lParam);NMHDR (hwndFrom, idFrom, code)
     If @error Then Return
     $event = DllStructGetData($tagNMHDR, 3)
     Select
     Case $wParam = $ListView1
          Select
                Case $event = $NM_CLICK
;~                     ListView_Click ()
                Case $event = $NM_DBLCLK
                    ListViewDoubleClick()
				Case $event = $NM_RCLICK
;~ 					ListView_RightClick ()
				Case $event = $NM_RDBLCLK
;~ 					ListView_RightDblClick ()
               EndSelect
     EndSelect
     $tagNMHDR = 0
     $event = 0
     $lParam = 0
 EndFunc  ;==>WM_Notify_Events
 