Jump to content
Rex

Run more that one instance

Recommended Posts

Posted (edited)

I wrote a small count down program some time ago Count Down Days, and shortly after I started using it I found out the I wanted more that one instance of it.

So I did some brute force copy ini files, that allowed me to start the program with cmdline - it works and I can have x copy's running, but I would like to just run the program once, and then create multiply countdown GUI's, but the my brain just stopped working, and even I did try to bang my head into the wall, and onto the table it still just would start working again.

And now I just have a damn headache 😖

I have rewritten the CDD to use SQLite, and that works swell - it's only that darn multi instance I can't get my brain to figure out a way to do, for me one usage it's not a problem, I can just add to the database, and run CDD with cmd 1.
But I would like the program to be user friendly, so the user can add another instance in the settings, and or start a new instance from the menu.

My idea was some thing like starting the main GUI in a for to loop, but I couldn't figure out how to handle the countdown and extra instances part.

And that is where I hope that some one could point kick me in the right direction, I have spend the last 3 days looking at the monitor and got nowhere, I know the solution is right there with in my reach, my arms is just to short :(

My code so far: (uses cmdline to handle multiply instances), and multiply language is still not implemented.

#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=CDD.ico
#AutoIt3Wrapper_Outfile=CDD.exe
#AutoIt3Wrapper_Res_Fileversion=0.0.0.0
#AutoIt3Wrapper_Res_HiDpi=Y
#AutoIt3Wrapper_Run_After=""d:\Profil\Rex\ISN AutoIt Studio\Projects\Versions Controler\Versions_Controle.exe" "%in%" "%scriptdir%" "%scriptfile%" "%fileversion%""
#AutoIt3Wrapper_Run_After=""d:\Profil\Rex\ISN AutoIt Studio\Projects\Versions Controler\Versions_Controle.exe" "%out%" "%scriptdir%" "%scriptfile%" "%fileversion%""
#AutoIt3Wrapper_Tidy_Stop_OnError=n
#AutoIt3Wrapper_Run_Au3Stripper=y
#Au3Stripper_Parameters=/tl /sf /sv /rsln /rm
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
; #INDEX# =======================================================================================================================
; Title .........: Countdown_Days.au3
; Script Version : 1.0.0
; AutoIt Version : 3.3.15.1 - Created with ISN AutoIt Studio v. 1.08 and 1.09 Dev
; Description ...: Countdown a specfic number of days
; Author(s) .....: Rex
; Creation date..: 2019/02/03
; ===============================================================================================================================

; #CHANGE LOG# ==================================================================================================================
; Changes .......: See project log
; Date ..........:
; ===============================================================================================================================
#cs Lang msg handling
    ; Get the string to handle (All stings should be read into arrays)
    Local $sString =  IniRead('English.lng', 'Settings', 'Msg_DelDef', '')
    ; Then we split the Title and msg into seperat arrays
    Local $aMsg = StringRegExp($sString, '{Title}(.*){Msg}(.*)', 1)
    ; Title would be 0 and msg 1, we also do a Stringformat to handle \r\n (@CRLF) and last we do a stringreplace to replace the {VAR}
    ; with the war we want it to be replaced with - the stringreplace is only nessary when we habe some var that should be placed inside the
    ; msgbox, else we dont need it.
    MsgBox(0, $aMsg[0], StringFormat(StringReplace($aMsg[1], '{VAR}', $aSel[1])))
#ce Lang msg handling

#pragma compile(Fileversion, 1.0.0.11)
#pragma compile(FileDescription, Countdown to a specific day)
#pragma compile(Comments, "Add The days To count down, And the program will countdown, and throw a message / sound")
#pragma compile(ProductName, CountDownDays)
#pragma compile(ProductVersion, 1.0)
#pragma compile(InternalName, "CDD")
#pragma compile(LegalCopyright, © Johnny Rex)
#pragma compile(OriginalFilename, CDD.exe)
;~ #pragma compile(LegalTrademarks, '"Trademark something, and some text in "quotes" etc...')
#pragma compile(CompanyName, 'Rex-IT')
#include <Date.au3>
#include <ColorConstants.au3>
#include <Array.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <ComboConstants.au3>
#include <DateTimeConstants.au3>
#include <EditConstants.au3>
#include <String.au3>
#include <GuiComboBox.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIDlg.au3>
#include <Sound.au3>
#include <GuiListBox.au3>
#include <WinAPISysWin.au3>
#include <FileConstants.au3>
#include <SQLite.au3>
#include <AutoItConstants.au3>
#include <Misc.au3>
#include <ListViewConstants.au3>
#include <GuiListView.au3>
#include <GuiScrollBars.au3>

Opt("GUIOnEventMode", 1)
Opt('MustDeclareVars', 1)
Opt('GUIResizeMode', $GUI_DOCKALL) ; To prevent ctrls to move when we add a new event
OnAutoItExitRegister('MenuItem_ExitClick') ; To save pos at closedown, if savepos is enabled
Global $g_iSecs, $g_iMins, $g_iHours, $g_iDays, $g_iInstance = 0, $g_sDBFile = @ScriptDir & '\Data.db'
; MsgBox Styles
Global $g_iMBErr = BitOR($MB_SETFOREGROUND, $MB_TOPMOST, $MB_ICONERROR), $g_iMBWarn = BitOR($MB_SETFOREGROUND, $MB_TOPMOST, $MB_ICONWARNING)
Global $g_iMBInfo = BitOR($MB_SETFOREGROUND, $MB_TOPMOST, $MB_ICONINFORMATION), $g_iMBQuest = BitOR($MB_SETFOREGROUND, $MB_TOPMOST, $MB_ICONQUESTION)
; GUI Handle
Global $hAddEvent, $idAddEvent, $hEditEvent, $idEditEvent, $hDeleteEvent, $idDelEvent, $hSettings
Global $idSet_DefEvents, $idSet_EditDef, $idSet_Global, $idSet_Color, $idSet_Instance
ConsoleWrite(@CRLF & 'Singleton = ' & _Singleton(@ScriptName) & @CRLF)
; Start SQLite
_SQLite_Startup()
If @error Then
    MsgBox($g_iMBErr, "SQLite Error", "SQLite3.dll Can't be Loaded!" & _
            @CRLF & 'Is SQLite3 installed on the system?' & @CRLF & 'Or is SQLite3.dll in the root of ' & @ScriptDir & @CRLF & @CRLF & _
            'If not SQLite can be downloaded from https://www.sqlite.org/download.html')
    Exit -1
EndIf
; Check if the database file exists
If Not FileExists(@ScriptDir & '\Data.db') Then
    ; The database don't exist, so we creates one
    ; Tell the user that we create a new database, and allow them to cancel the creation
    If MsgBox(BitOR($g_iMBWarn, $MB_OKCANCEL), 'DataBase', 'No database was found!' & @CRLF & _
            'Create a new DataBase?' & @CRLF & 'If Cancel the program will close!!') = $IDCANCEL Then
        OnAutoItExitUnRegister('MenuItem_ExitClick') ; Remove the on exit to prevent error
        Exit
    EndIf
    CreateDB()
    If @error Then
        MsgBox($g_iMBErr, 'DataBase creation failed', 'An error happend when trying to create the DataBase "Data.db" in ' & @ScriptDir & '\' & _
                @CRLF & @CRLF & 'The program will now close!!')
        OnAutoItExitUnRegister('MenuItem_ExitClick') ; Remove the on exit to prevent error
        Exit
    EndIf
EndIf


; Get settings
; First we check if the CDD was called with commandline parms

If $cmdline[0] = 1 Then
    ; If called by cmd line we suspect that the user wants to run an extra instance of the CDD
    ; Convert the cmdline to INT using Number, course we use INT to handle what instance of CDD thats running
    ; and Number would return 0 on most stings not INT
    $cmdline[1] = Number($cmdline[1])
    If Not $cmdline[1] = 0 Or $cmdline[0] = '' Then
        $g_iInstance = $cmdline[1]
    EndIf
EndIf
; Create Settings enum's, so we don't have to remember there pos in the array
Global Enum $eSet_RowID, $eSet_Inst, $eSet_Max, $eSet_Rem, $eSet_SoundPlay, $eSet_Popup, $eSet_Start, $eSet_Lang, _
        $eSet_SoundFile, $eSet_GuiLeft, $eSet_GuiTop, $eSet_Pin
Global $g_aSettings = DBHandle('GetSet', $g_iInstance)
; Create enum for the colors
Global Enum $eCol_RowID, $eCol_Inst, $eCol_GuiBk, $eCol_DragLbl, $eCol_Name, $eCol_Days0, $eCol_Days1, $eCol_Days2, _
        $eCol_Days3, $eCol_DaysLbl, $eCol_Time0, $eCol_Time1, $eCol_Time2, $eCol_Time3, $eCol_TimeColon, $eCol_EventUp, $eCol_EventUpBk
Global $g_aColors = DBHandle('GetColors', $g_iInstance)

; Check if the gui should start at last saved position
If $g_aSettings[$eSet_Rem] = False Then
    $g_aSettings[$eSet_GuiLeft] = -1 ; Default Screen center
    $g_aSettings[$eSet_GuiTop] = -1 ; Default Screen center
EndIf

; Enum event columns
Global Enum $eEvent_RowID, $eEvent_Inst, $eEvent_Name, $eEvent_Desc, $eEvent_Date, $eEvent_SoundFile, $eEvent_SoundPlay, $eEvent_Pop, $eEvent_Enabled
; Get events
Global $g_aEvents = DBHandle('GetEvents', $g_iInstance)

DBHandle('CloseDB', '') ; We close the database after last call

; Check if we have any Events
If UBound($g_aEvents) = 1 Then
    ; If we don't have any events, we creates the array with 1 and Null, 1 to be used to create an empty gui
    ; Null so we know that there isn't any events
    $g_aEvents[0][0] = 1
    $g_aEvents[0][1] = Null
EndIf

Global $g_idLbl_Days[$g_aSettings[$eSet_Max] + 1], _
        $g_idLbl_Hrs[$g_aSettings[$eSet_Max] + 1], _
        $g_idLbl_Min[$g_aSettings[$eSet_Max] + 1], _
        $g_idLbl_Sec[$g_aSettings[$eSet_Max] + 1], _
        $g_idLbl_Event[$g_aSettings[$eSet_Max] + 1]

Global $g_iSpace = 80
Global $g_iGuiHeight = ($g_iSpace * UBound($g_aEvents) - 1) + 8
#Region ### START Koda GUI section ### Form=D:\Profil\Rex\ISN AutoIt Studio\Projects\Countdown Days\GUI\hCountdownDays.kxf
Global $hCountdownDays = GUICreate("CountDown Days", 136, $g_iGuiHeight, $g_aSettings[$eSet_GuiLeft], _
        $g_aSettings[$eSet_GuiTop], $WS_POPUP, $WS_EX_TOOLWINDOW)
; Gui menu
Global $hCountdownDayscontext = GUICtrlCreateContextMenu()

Global $MenuItem_EventHandling = GUICtrlCreateMenu("Event(s)", $hCountdownDayscontext)
Global $MenuItem_AddEvent = GUICtrlCreateMenuItem("Add", $MenuItem_EventHandling)
GUICtrlSetOnEvent(-1, "MenuItem_AddEventClick")
Global $MenuItem_EditEvent = GUICtrlCreateMenuItem("Edit", $MenuItem_EventHandling)
GUICtrlSetOnEvent(-1, "MenuItem_EditEventClick")
Global $MenuItem_DeleteEvent = GUICtrlCreateMenuItem("Delete", $MenuItem_EventHandling)
GUICtrlSetOnEvent(-1, "MenuItem_DeleteEventClick")
Global $MenuItem_Settings = GUICtrlCreateMenuItem("Settings", $hCountdownDayscontext)
GUICtrlSetOnEvent(-1, "MenuItem_SettingsClick")
Global $MenuItem_Pin = GUICtrlCreateMenuItem("Pin in Place", $hCountdownDayscontext)
GUICtrlSetOnEvent(-1, "MenuItem_PinClick")
Global $MenuItem_Exit = GUICtrlCreateMenuItem("Exit", $hCountdownDayscontext)
GUICtrlSetOnEvent(-1, "MenuItem_ExitClick")
GUISetBkColor($g_aColors[$eCol_GuiBk])
Global $idLbl_Move = GUICtrlCreateLabel('', 1, 1, 134, 12, $SS_CENTER, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetFont(-1, 6, 400, 0, "MS Sans Serif")
GUICtrlSetBkColor(-1, $g_aColors[$eCol_DragLbl])

; Create a label to frame the gui, so it don't look to flat
Global $idFrame = GUICtrlCreateLabel('', 0, 0, 136, $g_iGuiHeight, BitOR($SS_SUNKEN, $WS_DISABLED, $SS_SIMPLE))

If $g_aEvents[0][1] = Null Then
    UpdateGui(False) ; Update Countdown GUI
Else
    UpdateGui(True) ; Update Countdown GUI
EndIf
; check if we needs to tick the pin, and disable the Move label
If $g_aSettings[$eSet_Pin] = True Then
    GUICtrlSetState($MenuItem_Pin, $GUI_CHECKED)
    GUICtrlSetState($idLbl_Move, $GUI_DISABLE)
EndIf
; Check if we should disable the add event MenuItem
If UBound($g_aEvents) - 1 >= $g_aSettings[$eSet_Max] Then GUICtrlSetState($MenuItem_AddEvent, $GUI_DISABLE)
; Show the CDD Gui
GUISetState(@SW_SHOW, $hCountdownDays)
#EndRegion ### END Koda GUI section ###


; Start the countdown.
Countdown()
; Register the adlib to call the countdown function every sec
AdlibRegister("Countdown", 1000)

While 1
    Sleep(900)
WEnd


Func MenuItem_AddEventClick()
    ; Create the GUI
    #Region ### START Koda GUI section ### Form=D:\Profil\Rex\ISN AutoIt Studio\Projects\Countdown Days\GUI\hAddEvent.kxf
    $hAddEvent = GUICreate("Add Event", 206, 407, -1, -1, BitOR($WS_SYSMENU, $WS_POPUP, $WS_CAPTION))
    GUISetOnEvent($GUI_EVENT_CLOSE, "hWnd_Close")
    $idAddEvent = GUICtrlCreateDummy() ; Create a dumme, we use this to calculate the CtrlID of the Controls created after the dummy
    GUICtrlCreateLabel("Default Events:", 8, 8, 77, 17) ; This would be dummy + 1 in ID
    GUICtrlCreateCombo("", 8, 24, 185, 25, $CBS_DROPDOWNLIST)
    GUICtrlSetTip(-1, "Saved default events")
    GUICtrlSetOnEvent(-1, "idCombo_EventsChange")
    GUICtrlCreateLabel("Event Name:", 8, 56, 66, 17)
    GUICtrlCreateInput("", 8, 72, 185, 21)
    GUICtrlSetLimit(-1, 24)
    GUICtrlSetTip(-1, "Name of event." & @CRLF & "This is the text that will be shown at the gui." & @CRLF _
             & "Max length is 24 chars")
    GUICtrlCreateLabel("Event description:", 8, 104, 89, 17)
    GUICtrlCreateEdit("", 8, 120, 185, 89, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN, $WS_VSCROLL))
    GUICtrlSetTip(-1, "Event description." & @CRLF _
             & "This wil be shown as a tip upon hovering, and also in the popup (if popup is enabled)")

    GUICtrlCreateCheckbox("Choose Event date by calendar", 8, 216, 170, 17)
    GUICtrlSetOnEvent(-1, "idCb_ChoseDateClick")
    GUICtrlCreateLabel("Days to event:", 8, 240, 73, 17)
    GUICtrlCreateInput("", 8, 256, 73, 21, BitOR($ES_CENTER, $ES_NUMBER))
    GUICtrlSetLimit(-1, 3)
    GUICtrlSetTip(-1, "Days to the event")
    GUICtrlCreateLabel("Time of event", 112, 240, 69, 17)
    GUICtrlCreateDate('', 112, 256, 82, 21, BitOR($DTS_UPDOWN, $DTS_TIMEFORMAT))
    GUICtrlSendMsg(-1, $DTM_SETFORMATW, 0, 'HH:mm:ss') ; Set time style
    GUICtrlCreateLabel("Event date:", 8, 240, 59, 17)
    GUICtrlSetState(-1, $GUI_HIDE)
    GUICtrlCreateDate('', 8, 256, 186, 21, 0)
    GUICtrlSendMsg(-1, $DTM_SETFORMATW, 0, 'yyyy/MM/dd HH:mm:ss') ; Set Date and Time style
    GUICtrlSetTip(-1, "The end date of the event")
    GUICtrlSetState(-1, BitOR($GUI_DISABLE, $GUI_HIDE)) ; Diasbled and hidden yy default
    GUICtrlCreateLabel("Sound to play:", 8, 280, 72, 17)
    GUICtrlCreateInput($g_aSettings[$eSet_SoundFile], 8, 296, 160, 21, $ES_READONLY) ; Default sound to play at event end
    GUICtrlSetTip(-1, $g_aSettings[$eSet_SoundFile])
    GUICtrlCreateButton("...", 174, 296, 21, 21)
    GUICtrlSetOnEvent(-1, "idBtn_SoundBrowseClick")
    GUICtrlCreateCheckbox("Play sound", 8, 328, 73, 17)
    CbSetState(-1, $g_aSettings[$eSet_SoundPlay])
    GUICtrlCreateCheckbox("Popup", 88, 328, 49, 17)
    CbSetState(-1, $g_aSettings[$eSet_Popup])
    GUICtrlCreateCheckbox("Save as default event", 8, 352, 124, 17)
    GUICtrlSetTip(-1, "Saves the event as a default event, that later can be choosen from the dropdown")
    GUICtrlCreateButton("&Add event", 8, 376, 75, 21)
    GUICtrlSetTip(-1, "Adds the events and closes the add event gui")
    GUICtrlSetOnEvent(-1, "idBtn_AddEventClick")
    GUICtrlCreateButton("&Close", 120, 376, 75, 21)
    GUICtrlSetOnEvent(-1, "hWnd_Close")
    #EndRegion ### END Koda GUI section ###
    
    ; Add default evnets to dropdown
    Local $aDefEvents = DBHandle('GetDefEvents', $g_iInstance)
    If IsArray($aDefEvents) Then
        For $i = 0 To UBound($aDefEvents) - 1
            ; Add the defaults to the combo and revert the name from hex to string.
            GUICtrlSetData($idAddEvent + 2, $aDefEvents[$i][$eEvent_Name])
        Next
    EndIf
    
    ; Set focus to the Event Name input
    GUICtrlSetState($idAddEvent + 4, $GUI_FOCUS)
    ; Show the gui
    GUISetState(@SW_SHOW, $hAddEvent)
EndFunc   ;==>MenuItem_AddEventClick

Func MenuItem_DeleteEventClick()
    ; Create the GUI
    #Region ### START Koda GUI section ### Form=D:\Profil\Rex\ISN AutoIt Studio\Projects\Countdown Days\GUI\hEditEvent.kxf
    $hDeleteEvent = GUICreate("Delete Event", 355, 214, Default, Default, BitOR($WS_SYSMENU, $WS_POPUP, $WS_CAPTION))
    GUISetOnEvent($GUI_EVENT_CLOSE, "hWnd_Close")
    $idDelEvent = GUICtrlCreateDummy()
    GUICtrlCreateLabel("Choose event to delete:", 8, 8, 122, 16)
    GUICtrlCreateListView("rowid|Event name|End date|Enabled", 8, 24, 338, 150, BitOR($LVS_NOSORTHEADER, $WS_VSCROLL), _
            BitOR($LVS_EX_FLATSB, $WS_EX_CLIENTEDGE, $LVS_EX_FULLROWSELECT))
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 10)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 130)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 120)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 3, 56)
    _GUICtrlListView_HideColumn(-1, 0) ; Hides the rowid colum
    GUICtrlSetTip(-1, "Select event to delete")
    GUICtrlCreateButton("&Delete", 8, 184, 75, 21)
    GUICtrlSetTip(-1, "Deletes selected event")
    GUICtrlSetOnEvent(-1, "idBtn_EventDeleteClick")
    GUICtrlCreateButton("&Close", 272, 184, 75, 21)
    GUICtrlSetTip(-1, "Closes the add event, without saving the event.")
    GUICtrlSetOnEvent(-1, "hWnd_Close")
    #EndRegion ### END Koda GUI section ###

    Local $aEvents = DBHandle('GetAllEvents', $g_iInstance)
    If IsArray($aEvents) Then
        For $i = 1 To UBound($aEvents) - 1
            GUICtrlCreateListViewItem($aEvents[$i][$eEvent_RowID] & '|' & $aEvents[$i][$eEvent_Name] & '|' & _
                    $aEvents[$i][$eEvent_Date] & '|' & $aEvents[$i][$eEvent_Enabled], $idDelEvent + 2)
        Next
    EndIf
    If _GUICtrlListView_GetItemCount($idDelEvent + 2) < 7 Then _GUICtrlListView_SetColumnWidth($idDelEvent + 2, 1, 158)
    GUISetState(@SW_SHOW, $hDeleteEvent)
EndFunc   ;==>MenuItem_DeleteEventClick

Func MenuItem_EditEventClick()
    ; Create GUI
    #Region ### START Koda GUI section ### Form=D:\Profil\Rex\ISN AutoIt Studio\Projects\Countdown Days\GUI\hEditEvent.kxf
    $hEditEvent = GUICreate("Edit Event", 292, 429, -1, -1, BitOR($WS_SYSMENU, $WS_POPUP, $WS_CAPTION))
    GUISetOnEvent($GUI_EVENT_CLOSE, "hWnd_Close")
    $idEditEvent = GUICtrlCreateDummy()
    GUICtrlSetOnEvent(-1, 'EventListView')
    GUICtrlCreateLabel("Choose event to edit:", 8, 8, 110, 17)
    GUICtrlCreateListView("rowid|Name|End date", 8, 24, 276, 94, BitOR($LVS_NOSORTHEADER, $WS_HSCROLL), _
            BitOR($LVS_EX_FLATSB, $WS_EX_CLIENTEDGE, $LVS_EX_FULLROWSELECT))
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 10)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 140)
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 114)
    GUICtrlSetTip(-1, "Double click to select the event")
    _GUICtrlListView_HideColumn(-1, 0) ; Hides the rowid colum
    GUICtrlCreateLabel("Event Name:", 8, 128, 66, 17)
    GUICtrlCreateInput("", 8, 144, 275, 21)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetLimit(-1, 24)
    GUICtrlSetTip(-1, "Name of event. This is the text that will be shown at the gui. Max length is 24 chars")
    GUICtrlCreateLabel("Event description:", 8, 176, 89, 17)
    GUICtrlCreateEdit("", 8, 192, 275, 57, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN, $WS_VSCROLL))
    GUICtrlSetTip(-1, "Event description. This will be shown as a tip upon hovering, and also in the popup (if popup is enabled)")
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateCheckbox("Choose new event date by calender", 8, 264, 200, 17)
    GUICtrlSetOnEvent(-1, "idCb_ChoseDateClick")
    GUICtrlSetState(-1, BitOR($GUI_DISABLE, $GUI_CHECKED))
    GUICtrlCreateLabel("Days to event:", 8, 288, 73, 17)
    GUICtrlSetState(-1, BitOR($GUI_HIDE, $GUI_DISABLE))
    GUICtrlCreateInput("", 8, 304, 73, 21, BitOR($ES_CENTER, $ES_NUMBER))
    GUICtrlSetState(-1, BitOR($GUI_HIDE, $GUI_DISABLE))
    GUICtrlSetLimit(-1, 3)
    GUICtrlSetTip(-1, "Days to the event, time will be from the time the event is added")
    GUICtrlCreateLabel("Time of event", 112, 288, 69, 17)
    GUICtrlSetState(-1, BitOR($GUI_HIDE, $GUI_DISABLE))
    GUICtrlCreateDate('', 112, 304, 82, 21, BitOR($DTS_UPDOWN, $DTS_TIMEFORMAT))
    GUICtrlSetState(-1, BitOR($GUI_HIDE, $GUI_DISABLE))
    GUICtrlSendMsg(-1, $DTM_SETFORMATW, 0, 'HH:mm:ss')
    GUICtrlSetTip(-1, "Time of the event")
    GUICtrlSetState(-1, BitOR($GUI_HIDE, $GUI_DISABLE))
    GUICtrlCreateLabel("Event date:", 8, 288, 59, 17)
    GUICtrlCreateDate('', 8, 304, 186, 21, 0)
    GUICtrlSendMsg(-1, $DTM_SETFORMATW, 0, 'yyyy/MM/dd HH:mm:ss')
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetTip(-1, "Choose the end date of the event")
    GUICtrlCreateLabel("Sound to play:", 8, 328, 72, 17)
    GUICtrlCreateInput("", 8, 344, 250, 21, $ES_READONLY)
    GUICtrlCreateButton("...", 264, 344, 21, 21)
    GUICtrlSetOnEvent(-1, "idBtn_SoundBrowseClick")
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateCheckbox("Play sound", 8, 376, 73, 17)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateCheckbox("Popup", 88, 376, 49, 17)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateCheckbox("Enabled", 144, 376, 60, 17)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetTip(-1, "Enables or disables the event, if disabled it don't show in the countdown gui")
    GUICtrlCreateButton("&Update", 8, 400, 75, 21)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetTip(-1, "Updates the selected event")
    GUICtrlSetOnEvent(-1, "idBtn_UpdateEventClick")
    GUICtrlCreateButton("&Close", 210, 400, 75, 21)
    GUICtrlSetOnEvent(-1, "hWnd_Close")
    #EndRegion ### END Koda GUI section ###
    ; Add events to the listView
    Local $aEvents = DBHandle('GetAllEvents', $g_iInstance)
    If IsArray($aEvents) Then
        For $i = 1 To UBound($aEvents) - 1
            GUICtrlCreateListViewItem($aEvents[$i][$eEvent_RowID] & '|' & $aEvents[$i][$eEvent_Name] & '|' & $aEvents[$i][$eEvent_Date], _
                    $idEditEvent + 2)
        Next
    EndIf
    If _GUICtrlListView_GetItemCount($idEditEvent + 2) < 3 Then _GUICtrlListView_SetColumnWidth($idEditEvent + 2, 1, 158)
    ; Show the gui
    GUISetState(@SW_SHOW, $hEditEvent)
    ; Catch double click in Edit event listview
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
EndFunc   ;==>MenuItem_EditEventClick

Func MenuItem_SettingsClick()
    #Region ### START Koda GUI section ### Form=D:\Profil\Rex\ISN AutoIt Studio\Projects\Countdown Days\GUI\hSettings.kxf
    $hSettings = GUICreate("Settings", 523, 478, Default, Default, BitOR($WS_SYSMENU, $WS_POPUP, $WS_CAPTION))
    GUISetOnEvent($GUI_EVENT_CLOSE, "hWnd_Close")
    
    $idSet_DefEvents = GUICtrlCreateGroup("Default events:", 8, 8, 201, 185)
    GUICtrlCreateListView("RowID|Name", 16, 24, 186, 134, BitOR($GUI_SS_DEFAULT_LISTVIEW, $LVS_NOCOLUMNHEADER, $LVS_NOSORTHEADER), BitOR($WS_EX_CLIENTEDGE, $LVS_EX_FULLROWSELECT))
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 0) ; Hide the RowID colum
    GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 170)
    GUICtrlSetTip(-1, "Default events that, can be picked from add event.")
    GUICtrlCreateRadio("Edit", 16, 168, 40, 17)
    GUICtrlSetState(-1, $GUI_CHECKED)
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlSetTip(-1, "Edit selected event")
    GUICtrlCreateRadio("Delete", 64, 168, 60, 17)
    GUICtrlSetTip(-1, "Delete the selected event")
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateButton("Edit", 144, 168, 50, 20)
    GUICtrlSetTip(-1, "Deletes the selected Default event")
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    
    $idSet_Instance = GUICtrlCreateGroup("Instance", 8, 200, 201, 49)
    GUICtrlCreateInput("0", 16, 217, 41, 20, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_READONLY, $ES_NUMBER))
    GUICtrlCreateUpdown(-1)
    GUICtrlSetLimit(-1, 3, 0)
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateRadio("Add", 64, 218, 40, 17)
    GUICtrlSetTip(-1, 'Adds a nother Instance to the database')
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateRadio("Remove", 106, 218, 60, 17)
    GUICtrlSetTip(-1, 'Removes an Instance from the DataBase,' & @CRLF & 'this will also remove all events added inder that Instance')
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateButton("OK", 172, 217, 29, 20)
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    
    $idSet_Global = GUICtrlCreateGroup("Global settings:", 8, 256, 201, 185)
    GUICtrlCreateLabel("Max number of events:", 16, 272, 112, 21, $SS_CENTERIMAGE)
    GUICtrlSetTip(-1, "Max number of events." & @CRLF & "On a 1920x1080 Screen the max would be aprox 13 events.")
    GUICtrlCreateInput($g_aSettings[$eSet_Max], 138, 272, 21, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_NUMBER))
    GUICtrlSetLimit(-1, 2)
    GUICtrlSetTip(-1, "Max number of events." & @CRLF & "On a 1920x1080 Screen the max would be aprox 13 events.")
    GUICtrlCreateCheckbox("Remember position", 16, 296, 110, 17)
    CbSetState(-1, $g_aSettings[$eSet_Rem])
    GUICtrlSetTip(-1, "When countdown is closed" & @CRLF & " it saves the position it was placed, and starts at that position.")
    GUICtrlCreateCheckbox("Play Sound", 128, 296, 74, 17)
    CbSetState(-1, $g_aSettings[$eSet_SoundPlay])
    GUICtrlSetTip(-1, "Plays a sound when the event time is up.")
    GUICtrlCreateCheckbox("Show popup", 16, 320, 80, 17)
    CbSetState(-1, $g_aSettings[$eSet_Popup])
    GUICtrlSetTip(-1, "Shows a popup windows, when the event time is up." & @CRLF & "The content of the popup windows will be the event descrption.")
    GUICtrlCreateCheckbox("Start with system", 104, 320, 98, 17)
    CbSetState(-1, $g_aSettings[$eSet_Start])
    GUICtrlSetTip(-1, "Start the program with windows")
    GUICtrlCreateLabel("Language:", 16, 344, 55, 17)
    GUICtrlCreateCombo($g_aSettings[$eSet_Lang], 16, 360, 185, 21, BitOR($CBS_DROPDOWNLIST, $CBS_AUTOHSCROLL))
    GUICtrlSetTip(-1, 'The language to use for menus, lables, buttons ect.')
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateLabel("Default alarm sound:", 16, 392, 101, 17)
    GUICtrlCreateInput($g_aSettings[$eSet_SoundFile], 16, 408, 161, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_READONLY))
    GUICtrlSetTip(-1, "Default sound to play when the event timeis up." & @CRLF & $g_aSettings[$eSet_SoundFile])
    GUICtrlCreateButton("...", 184, 408, 21, 21)
    GUICtrlSetOnEvent(-1, "idBtn_SoundBrowseClick")
    GUICtrlCreateGroup("", -99, -99, 1, 1)

    $idSet_Color = GUICtrlCreateGroup("Change Colors:", 216, 8, 297, 217)
    GUICtrlCreateLabel("GUI BkGround", 224, 24, 110, 20, $SS_CENTERIMAGE)
    GUICtrlSetTip(-1, 'The background color of the GUI')
    GUICtrlCreateButton("", 336, 24, 20, 20)
    GUICtrlSetBkColor(-1, $g_aColors[$eCol_GuiBk])
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateLabel("GUI Drag label:", 224, 48, 110, 20, $SS_CENTERIMAGE)
    GUICtrlSetTip(-1, 'Color of the drag label')
    GUICtrlCreateButton("", 336, 48, 20, 20)
    GUICtrlSetBkColor(-1, $g_aColors[$eCol_DragLbl])
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateLabel("Event name:", 224, 72, 110, 20, $SS_CENTERIMAGE)
    GUICtrlSetTip(-1, 'Color of the Event text')
    GUICtrlCreateButton("", 336, 72, 20, 20)
    GUICtrlSetBkColor(-1, $g_aColors[$eCol_Name])
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateLabel("Days default:", 224, 96, 110, 20, $SS_CENTERIMAGE)
    GUICtrlSetTip(-1, 'When more that 15 days left')
    GUICtrlCreateButton("", 336, 96, 20, 20)
    GUICtrlSetBkColor(-1, $g_aColors[$eCol_Days0])
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateLabel("Days 5 to 0:", 224, 120, 110, 20, $SS_CENTERIMAGE)
    GUICtrlSetTip(-1, 'When between 5 and 0 days left')
    GUICtrlCreateButton("", 336, 120, 20, 20)
    GUICtrlSetBkColor(-1, $g_aColors[$eCol_Days1])
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateLabel("Days 10 to 6:", 224, 144, 110, 20, $SS_CENTERIMAGE)
    GUICtrlSetTip(-1, 'When between 10 and 6 days left')
    GUICtrlCreateButton("", 336, 144, 20, 20)
    GUICtrlSetBkColor(-1, $g_aColors[$eCol_Days2])
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateLabel("Days 15 to 11:", 224, 168, 110, 20, $SS_CENTERIMAGE)
    GUICtrlSetTip(-1, 'When between 15 to 11 days left')
    GUICtrlCreateButton("", 336, 168, 20, 20)
    GUICtrlSetBkColor(-1, $g_aColors[$eCol_Days3])
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateLabel("Days label:", 224, 192, 110, 20, $SS_CENTERIMAGE)
    GUICtrlSetTip(-1, 'Color of the static label "Days"')
    GUICtrlCreateButton("", 336, 192, 20, 20)
    GUICtrlSetBkColor(-1, $g_aColors[$eCol_DaysLbl])
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateLabel("Time default:", 376, 24, 110, 20, $SS_CENTERIMAGE)
    GUICtrlSetTip(-1, 'When more than 0 days left')
    GUICtrlCreateButton("", 488, 24, 20, 20)
    GUICtrlSetBkColor(-1, $g_aColors[$eCol_Time0])
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateLabel("Time 6 to 0:", 376, 48, 110, 20, $SS_CENTERIMAGE)
    GUICtrlSetTip(-1, 'When 0 days and between 6 and 0 hours left')
    GUICtrlCreateButton("", 488, 48, 20, 20)
    GUICtrlSetBkColor(-1, $g_aColors[$eCol_Time1])
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateLabel("Time 12 to 7:", 376, 72, 110, 20, $SS_CENTERIMAGE)
    GUICtrlSetTip(-1, 'When 0 days and between 12 to 7 hours left')
    GUICtrlCreateButton("", 488, 72, 20, 20)
    GUICtrlSetBkColor(-1, $g_aColors[$eCol_Time2])
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateLabel("Time 23 to 13:", 376, 96, 110, 20, $SS_CENTERIMAGE)
    GUICtrlSetTip(-1, 'When 0 days and between 23 and 13 hours left')
    GUICtrlCreateButton("", 488, 96, 20, 20)
    GUICtrlSetBkColor(-1, $g_aColors[$eCol_Time3])
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateLabel("Time colon:", 376, 120, 110, 20, $SS_CENTERIMAGE)
    GUICtrlSetTip(-1, "The static label ':' between hour, min and sec")
    GUICtrlCreateButton("", 488, 120, 20, 20)
    GUICtrlSetBkColor(-1, $g_aColors[$eCol_TimeColon])
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateLabel("Event up:", 376, 144, 110, 20, $SS_CENTERIMAGE)
    GUICtrlSetTip(-1, 'Event name text color when the event time is up')
    GUICtrlCreateButton("", 488, 144, 20, 20)
    GUICtrlSetBkColor(-1, $g_aColors[$eCol_EventUp])
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateLabel("Event up BkGround:", 376, 168, 110, 20, $SS_CENTERIMAGE)
    GUICtrlSetTip(-1, 'Background color of event name, when time is up')
    GUICtrlCreateButton("", 488, 168, 20, 20)
    GUICtrlSetBkColor(-1, $g_aColors[$eCol_EventUpBk])
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateButton("Default", 432, 192, 75, 20)
    GUICtrlSetTip(-1, "Set the colors to default")
    GUICtrlSetOnEvent(-1, 'Click_Settings')
    GUICtrlCreateGroup("", -99, -99, 1, 1)

    $idSet_EditDef = GUICtrlCreateGroup("Edit default event:", 216, 232, 297, 209)
    GUICtrlCreateLabel("Event name:", 224, 248, 64, 21, $SS_CENTERIMAGE)
    GUICtrlCreateInput("", 288, 248, 137, 21)
    GUICtrlSetLimit(-1, 24)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateLabel("Days:", 432, 248, 31, 20, $SS_CENTERIMAGE)
    GUICtrlCreateInput("", 464, 248, 41, 21)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateLabel("Event description:", 224, 272, 89, 17)
    GUICtrlCreateEdit("", 224, 288, 281, 81, BitOR($ES_AUTOVSCROLL, $ES_WANTRETURN, $WS_VSCROLL))
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateLabel("Alarm sound:", 224, 384, 65, 20, $SS_CENTERIMAGE)
    GUICtrlCreateInput('', 288, 384, 193, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_READONLY))
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateButton("...", 488, 384, 21, 21)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetOnEvent(-1, "idBtn_SoundBrowseClick")
    GUICtrlCreateCheckbox("Play sound", 224, 412, 72, 17)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateCheckbox("Show popup", 304, 412, 80, 17)
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlCreateLabel("", 464, 416, 10, 17) ; Hidden label to hold the row id of the def event thats been edited
    GUICtrlSetState(-1, $GUI_DISABLE)
    GUICtrlSetState(-1, $GUI_HIDE)
    GUICtrlCreateGroup("", -99, -99, 1, 1)

    GUICtrlCreateButton("OK", 8, 448, 75, 21)
    GUICtrlSetOnEvent(-1, "Click_Settings")
    GUICtrlCreateButton("Close", 440, 448, 75, 21)
    GUICtrlSetOnEvent(-1, "hWnd_Close")
    #EndRegion ### END Koda GUI section ###
    
    
    ; Update the gui with info's from the settings file, or if no settings file exists, with defaults
    ; Add default evnets to Listbox (The events that is saved, and can be loaded in add event)
    Local $aDefEvents = DBHandle('GetDefEvents', '')
    If IsArray($aDefEvents) Then ; If it's an array we continue
        
        For $i = 0 To UBound($aDefEvents) - 1
            
            ; Add the defaults to the listbox and convert the name from hex to string.
            GUICtrlCreateListViewItem($aDefEvents[$i][0] & '|' & $aDefEvents[$i][1], $idSet_DefEvents + 1)
            
        Next
    EndIf

    ; Check if the Remember, playsound, popup and Start with windows is enabled in settings
    CbSetState($idSet_Global + 3, $g_aSettings[$eSet_Rem])
    CbSetState($idSet_Global + 4, $g_aSettings[$eSet_SoundPlay])
    CbSetState($idSet_Global + 5, $g_aSettings[$eSet_Popup])
    CbSetState($idSet_Global + 6, $g_aSettings[$eSet_Start])
    
    ; Show the gui
    GUISetState(@SW_SHOW, $hSettings)
EndFunc   ;==>MenuItem_SettingsClick

Func MenuItem_ExitClick()
    ; We only run this function Once
    Local Static $bRunned = True
    If $bRunned = True Then
        $bRunned = False
        ; Check if the program should save it's poition
        If $g_aSettings[$eSet_Rem] = True Then
            SetPos()
        EndIf
        ; Delete the CDD GUI
        GUIDelete($hCountdownDays)
        ; VACUUM the DataBase
        DBHandle('VACUUM', '')
        ; Close Sql
        _SQLite_Close()
    EndIf
    Exit
EndFunc   ;==>MenuItem_ExitClick
Func SetPos()
    ; get the position of the GUI
    Local $aPos = WinGetPos($hCountdownDays)
    Local $aPos2D[3][2] = [[$g_aSettings[$eSet_RowID], $g_aSettings[$eSet_RowID]], ['PosLeft', $aPos[0]], ['PosTop', $aPos[1]]]
    ; Update the position in the DataBase
    DBHandle('UpdatePos', $aPos2D)
    ; Update the Settings array
    $g_aSettings[$eSet_GuiLeft] = $aPos[0]
    $g_aSettings[$eSet_GuiTop] = $aPos[1]
EndFunc   ;==>SetPos

Func MenuItem_PinClick()
    ; Get state of MenuItem Pin in place
    ; If the pin is enabled, the gui can't be moved
    ; When pinned Save last pos is automaticly enabled
    If BitAND(GUICtrlRead($MenuItem_Pin), $GUI_CHECKED) = $GUI_CHECKED Then
        GUICtrlSetState($MenuItem_Pin, $GUI_UNCHECKED)
        $g_aSettings[$eSet_Pin] = False ; Update the var
        DBHandle('UpdateSingleSet', 'Pin|False')
        GUICtrlSetState($idLbl_Move, $GUI_ENABLE) ; Enable the label, this allows the gui to be moved
    Else
        GUICtrlSetState($MenuItem_Pin, $GUI_CHECKED)
        $g_aSettings[$eSet_Pin] = True ; Update the var
        $g_aSettings[$eSet_Rem] = True ; Enables remember last pos
        DBHandle('UpdateSingleSet', 'Pin|True')
        DBHandle('UpdateSingleSet', 'Remember|True')
        SetPos()
        DBHandle('CloseDB', '')
        GUICtrlSetState($idLbl_Move, $GUI_DISABLE) ; Disable the label, preventing the gui to be moved
    EndIf
    
EndFunc   ;==>MenuItem_PinClick

Func hWnd_Close()
    ; Delete the gui
    GUIDelete(@GUI_WinHandle)
    ; Close the database
    DBHandle('CloseDb', '')
EndFunc   ;==>hWnd_Close
Func Click_Main()
    ; only one thing calls this function, and that a event label
    ; And all we chould do here is to kil the playing sound
    ; Create a static to prevent further clicks (due to bug in setonevent remove)
    Local Static $iCtrlID = 0
    
    If $iCtrlID <> @GUI_CtrlId Then
        ConsoleWrite(@CRLF & 'Label Click = ' & @GUI_CtrlId & @CRLF)
        $iCtrlID = @GUI_CtrlId
        SoundPlay('')
        GUICtrlSetOnEvent(@GUI_CtrlId, '') ; And this don't work due to a bug in autoit :'(
    EndIf
EndFunc   ;==>Click_Main
Func Click_Settings()
    ; Handle Button, Checkbox, Radios etc. clicks
    ; First we get the Winhandle of the win in where the click came from
    ConsoleWrite(@CRLF & 'Id = ' & @GUI_CtrlId & @CRLF)
    Switch @GUI_CtrlId
        Case $idSet_DefEvents + 2 ; Default events radio Edit
            ; Set butten text Edit
            GUICtrlSetData($idSet_DefEvents + 4, 'Edit')
        Case $idSet_DefEvents + 3 ; Default events Radio delete
            ; Set button text Delete
            GUICtrlSetData($idSet_DefEvents + 4, 'Delete')
        Case $idSet_DefEvents + 4 ; Default evnets Button Edit/Remove
            ; Check that an event has been chosen
            If GUICtrlRead($idSet_DefEvents + 1) Then
                ; Read the selected event, and split the read info where row 0 would be the rowid, and row 1 the Name of the event
                Local $aSel = StringSplit(StringTrimRight(GUICtrlRead(GUICtrlRead($idSet_DefEvents + 1)), 1), '|', $STR_NOCOUNT)
                
                ; Check if we should Delete or edit the selected event
                Switch GUICtrlRead($idSet_DefEvents + 4)
                    Case 'Edit'
                        
                        Local $aData = DBHandle('GetSingleDefEvent', $aSel[0])
                        
                        ; Update the edit event ctrls
                        GUICtrlSetData($idSet_EditDef + 2, $aData[0]) ; Event Name
                        GUICtrlSetData($idSet_EditDef + 4, $aData[2]) ; Days
                        GUICtrlSetData($idSet_EditDef + 6, $aData[1]) ; Description
                        GUICtrlSetData($idSet_EditDef + 8, $aData[3]) ; Sound file
                        CbSetState($idSet_EditDef + 10, StringToType($aData[4])) ; Play Sound
                        CbSetState($idSet_EditDef + 11, StringToType($aData[5])) ; Show popup
                        ; Set rowid of the event we just edited, to the hidden label - So we can update it later wehen/if the ok button is hit
                        GUICtrlSetData($idSet_EditDef + 12, $aSel[0]) ; Hidden label to hold rowid of the edited event
                        
                        ; And enable the controls.
                        For $i = 2 To 11
                            GUICtrlSetState($idSet_EditDef + $i, $GUI_ENABLE)
                        Next
                    Case 'Delete'
                        ; If the user clicks Delete
                        ; First we warn, that the selected will be deletede, and can't be restored
                        Local $iStyle = BitOR($MB_ICONWARNING, $MB_SETFOREGROUND, $MB_TOPMOST, $MB_SYSTEMMODAL, $MB_YESNO)
                        If MsgBox($iStyle, 'Delete default event', 'The default event: ' & $aSel[1] & @CRLF & "Will be delete, and can't be restored!" & _
                                @CRLF & @CRLF & 'Do you want to continue?') = $IDNO Then Return
                        ; If msg = yes then remove the item from the database and listview
                        DBHandle('DelSingleDefEvent', $aSel[0])
                        DBHandle('CloseDB', '')
                        _GUICtrlListView_DeleteItemsSelected($idSet_DefEvents + 1)
                EndSwitch
            EndIf
        Case $idSet_Instance + 2 ; Instance Updown
            ConsoleWrite(@CRLF & 'Read text from ctrlid 2 = ' & GUICtrlRead(@GUI_CtrlId - 1) & @CRLF)
        Case $idSet_Instance + 3 ; Instance Radio Add
            ConsoleWrite(@CRLF & 'Read text from ctrlid 3= ' & GUICtrlGetState(@GUI_CtrlId) & @CRLF)
        Case $idSet_Instance + 4 ; Instance Radio Delete
            ConsoleWrite(@CRLF & 'Read text from ctrlid 4= ' & GUICtrlGetState(@GUI_CtrlId) & @CRLF)
        Case $idSet_Instance + 5 ; Instance button OK
            ConsoleWrite(@CRLF & 'Read text from ctrlid 5= ' & GUICtrlRead(@GUI_CtrlId) & @CRLF)
        Case $idSet_Color + 2 To $idSet_Color + 30 ; Colors Colorpicker buttons
            Local $dColor = _ChooseColor(2, 0, 0, @GUI_WinHandle)
            If Not @error Then
                ; Set the background color of the button, to show the user what color was choosen
                GUICtrlSetBkColor(@GUI_CtrlId, $dColor)
                ; Set text color to same as background, so we can hide the text we add
                GUICtrlSetColor(@GUI_CtrlId, $dColor)
                ; Set the text size to 1, so the button don't look funny when we add text to it
                GUICtrlSetFont(@GUI_CtrlId, 1)
                ; Write the colorcode as text on the button, we do this so when we saves the settings
                ; we can read the color code from the button
                GUICtrlSetData(@GUI_CtrlId, $dColor)
            EndIf
        Case $idSet_Color + 31 ; Colors Button Default
            ; Set default colors
            Local $aCol = StringSplit('0x4E4E4E|0x808080|0xFFFFFF|0x000000|0xFF0000|0xFFFF00|0x008000|0x000000|0x000000|' & _
                    '0xFF0000|0xFFFF00|0x008000|0x000000|0xFF0000|0xFFFF00', '|', $STR_NOCOUNT)
            Local $y = 0
            For $i = 2 To 30 Step 2
                ; Set the background color of the button, to show the user what color was choosen
                GUICtrlSetBkColor($idSet_Color + $i, $aCol[$y])
                ; Set text color to same as background, so we can hide the text we add
                GUICtrlSetColor($idSet_Color + $i, $aCol[$y])
                ; Set the text size to 1, so the button don't look funny when we add text to it
                GUICtrlSetFont($idSet_Color + $i, 1)
                ; Write the colorcode as text on the button, we do this so when we saves the settings
                ; we can read the color code from the button
                GUICtrlSetData($idSet_Color + $i, $aCol[$y])
                $y += 1
            Next
        Case $idSet_EditDef + 14 ; Settings OK button
            ; Read infos and update the settings.
            ; Get maxEvents
            Local $iMax = GUICtrlRead($idSet_Global + 2)
            If $iMax = '' Then
                MsgBox(BitOR($MB_ICONERROR, $MB_SETFOREGROUND, $MB_TOPMOST), 'Max number of events', _
                        "The input Max number of events is empty, but it shouldn't be" & @CRLF & 'Please type number of max allowed events!!')
                GUICtrlSetState($idSet_Global + 2, $GUI_FOCUS)
                Return
            EndIf
            
            ; Get Colors
            Local $y = 0
            For $i = 2 To 30 Step 2
                ; Read the selected color by reading the button text
                Local $dBtnColor = GUICtrlRead($idSet_Color + $i)
                ; Check if the button has any text, if so we update the color array with the new color
                If $dBtnColor <> '' Then $g_aColors[$y] = $dBtnColor
                $y += 1
            Next
            
            ; Update Settings Array
            ; Rember last position
            $g_aSettings[$eSet_Rem] = (GUICtrlRead($idSet_Global + 3) = $GUI_CHECKED) ? True : False
            ; Play sound
            $g_aSettings[$eSet_SoundPlay] = (GUICtrlRead($idSet_Global + 4) = $GUI_CHECKED) ? True : False
            ; Show popup
            $g_aSettings[$eSet_Popup] = (GUICtrlRead($idSet_Global + 5) = $GUI_CHECKED) ? True : False
            ; Start with windows
            $g_aSettings[$eSet_Start] = (GUICtrlRead($idSet_Global + 6) = $GUI_CHECKED) ? True : False
            ; Sound file
            $g_aSettings[$eSet_SoundFile] = GUICtrlRead($idSet_Global + 10)


            ; Check if the program should rember it's last position
            If GUICtrlRead($idSet_Global + 3) = $GUI_CHECKED Then
                SetPos()
            EndIf
            ; Check if the program should start with windows
            If GUICtrlRead($idSet_Global + 6) = $GUI_CHECKED Then
                RegWrite('HKCU\Software\Microsoft\Windows\CurrentVersion\Run', 'CDD_' & $g_iInstance, 'REG_SZ', @ScriptFullPath & ' ' & $g_iInstance)
            Else
                RegDelete('HKCU\Software\Microsoft\Windows\CurrentVersion\Run', 'CDD_' & $g_iInstance)
            EndIf

            ; Check if an event has been edited
            Local $iRowID = GUICtrlRead($idSet_EditDef + 12)
            If $iRowID <> '' Then
                Local $aDefEvents[7][2]
                $aDefEvents[0][0] = $iRowID
                $aDefEvents[0][1] = ''
                $aDefEvents[1][0] = 'Name'
                $aDefEvents[1][1] = GUICtrlRead($idSet_EditDef + 2)
                $aDefEvents[2][0] = 'Desc'
                $aDefEvents[2][1] = GUICtrlRead($idSet_EditDef + 6)
                $aDefEvents[3][0] = 'Days'
                $aDefEvents[3][1] = GUICtrlRead($idSet_EditDef + 4)
                $aDefEvents[4][0] = 'Soundfile'
                $aDefEvents[4][1] = GUICtrlRead($idSet_EditDef + 8)
                $aDefEvents[5][0] = 'PlaySound'
                $aDefEvents[5][1] = (GUICtrlRead($idSet_EditDef + 10) = $GUI_CHECKED) ? True : False
                $aDefEvents[6][0] = 'PopUp'
                $aDefEvents[6][1] = (GUICtrlRead($idSet_EditDef + 11) = $GUI_CHECKED) ? True : False
                ; Update event in DataBase
                DBHandle('UpdateDefEvent', $aDefEvents)
            EndIf

            ; Set GUI background color
            GUISetBkColor($g_aColors[$eCol_GuiBk], $hCountdownDays)
            ; Set the color of the drag lable
            GUICtrlSetBkColor($idLbl_Move, $g_aColors[$eCol_DragLbl])
            ; Update the gui
            UpdateGui(False)
            ; And finaly update the DataBase
            DBHandle('UpdateSet', '')
            DBHandle('CloseDB', '')
            ; Delete the GUI
            GUIDelete($hSettings)
    EndSwitch
    
EndFunc   ;==>Click_Settings



Func idCb_ChoseDateClick()
    ; Handel the Choose by date checkbox for either Add or Edit event gui
    ; First we check if it's Add or Edit event gui that is asking
    Switch @GUI_WinHandle ; The handle of the current gui
        Case WinGetHandle($hAddEvent) ; If its Add event
            Local $iCtrlID = $idAddEvent
        Case WinGetHandle($hEditEvent) ; If its Edit event
            Local $iCtrlID = $idEditEvent
    EndSwitch
    
    ; Get state of checkbox
    Local $bChoseDate = (GUICtrlRead($iCtrlID + 7) = $GUI_CHECKED) ? True : False
    
    ; Handel state of checkbox
    Switch $bChoseDate
        Case True
            
            ; Hide, disable and clear days and time input / label
            GUICtrlSetState($iCtrlID + 8, BitOR($GUI_DISABLE, $GUI_HIDE)) ; Hide the label Days to event
            GUICtrlSetState($iCtrlID + 9, BitOR($GUI_DISABLE, $GUI_HIDE)) ; Hide the input Days to event
            GUICtrlSetData($iCtrlID + 9, '') ; Clear the input Days to event
            GUICtrlSetState($iCtrlID + 10, BitOR($GUI_DISABLE, $GUI_HIDE)) ; Hides the label Time to event
            GUICtrlSetState($iCtrlID + 11, BitOR($GUI_DISABLE, $GUI_HIDE)) ; Hide the TimePicker Time to event

            ; Show date picker and lable
            GUICtrlSetState($iCtrlID + 12, BitOR($GUI_ENABLE, $GUI_SHOW)) ; Show the label Event date
            GUICtrlSetState($iCtrlID + 13, BitOR($GUI_ENABLE, $GUI_SHOW)) ; Show the Date time picker

        Case False
            
            ; Hide, disable and clear date picker and label
            GUICtrlSetState($iCtrlID + 12, BitOR($GUI_DISABLE, $GUI_HIDE)) ; Hide the label Event date
            GUICtrlSetState($iCtrlID + 13, BitOR($GUI_DISABLE, $GUI_HIDE)) ; Hide the Date time picker

            ; Enable, show and set time input / labels
            GUICtrlSetState($iCtrlID + 8, BitOR($GUI_ENABLE, $GUI_SHOW)) ; Show the label Days to event
            GUICtrlSetState($iCtrlID + 9, BitOR($GUI_ENABLE, $GUI_SHOW)) ; Shows the Input Days to event
            GUICtrlSetState($iCtrlID + 10, BitOR($GUI_ENABLE, $GUI_SHOW)) ; Shows the label Time to event
            GUICtrlSetState($iCtrlID + 11, BitOR($GUI_ENABLE, $GUI_SHOW)) ; Show time picker
            
    EndSwitch
    
EndFunc   ;==>idCb_ChoseDateClick


Func idBtn_AddEventClick()
    ; First we handle the inputs etc.
    ; Read data from gui, and add it to an array
    Local $sReadName = GUICtrlRead($idAddEvent + 4) ; Read name from Event name input
    If $sReadName = '' Then
        MsgBox(BitOR($MB_ICONERROR, $MB_SETFOREGROUND, $MB_TOPMOST), 'Event Name Error', 'The input "Event name" was empty!' & _
                @CRLF & 'Please enter type an Event name!!')
        GUICtrlSetState($idAddEvent + 4, $GUI_FOCUS)
        Return
    EndIf

    ; Handel state of checkbox choose event date by calendar
    Switch (GUICtrlRead($idAddEvent + 7) = $GUI_CHECKED) ? True : False
        Case True
            ; Get DTS from date picker
            Local $sDTS = GUICtrlRead($idAddEvent + 13)
        Case False
            ; Check that days is not empty
            Local $sReadDays = GUICtrlRead($idAddEvent + 9)
            If $sReadDays <> '' Then
                Local $sDTS = CalcEndDate($sReadDays, GUICtrlRead($idAddEvent + 11))
            Else
                MsgBox(BitOR($MB_ICONERROR, $MB_SETFOREGROUND, $MB_TOPMOST), 'Days Error', 'The input "Days to event" was empty!' & _
                        @CRLF & 'Please enter number of days!!')
                GUICtrlSetState($idAddEvent + 9, $GUI_FOCUS)
                Return
            EndIf
    EndSwitch
    Local $sEvent = @YEAR & @MON & @MDAY & @HOUR & @MIN & @SEC ; We use this to prevent events with same SectionNames in the ini file.
    ; Create an array to hold the Event values
    Local $aValues[8]
    $aValues[0] = $g_iInstance
    $aValues[1] = $sReadName ; Event Name
    $aValues[2] = StringReplace(GUICtrlRead($idAddEvent + 6), @CRLF, ' ') ; Get data from edit
    $aValues[3] = StringRegExpReplace($sDTS, "(\d{4})/(\d{2})/(\d{2})(.*)", "$1-$2-$3$4", 0) ; Event end date
    $aValues[4] = GUICtrlRead($idAddEvent + 15) ; Get sound to play from input sound to play
    $aValues[5] = (GUICtrlRead($idAddEvent + 17) = $GUI_CHECKED) ? True : False ; To play or not play sound at event end
    $aValues[6] = (GUICtrlRead($idAddEvent + 18) = $GUI_CHECKED) ? True : False ; To show or not to show popup at event end
    $aValues[7] = 'True' ; The Event is Enabled by default
    DBHandle('AddEvent', $aValues)
    
    ; Get state of save as default checkbox
    If GUICtrlRead($idAddEvent + 19) = $GUI_CHECKED Then
        ; We don't save all the info, only Days to Event, Sound to play, To play o not play the sound and to show or not to show the popup
        ; Trim the array from unneeded data
        _ArrayDelete($aValues, '0;7') ; Remove Instance and Enabled
        
        ; Get the amount of days to event +1 course the cal is only returing whole days and the event will be in x days and 23:59:xx sec
        ; There for we needs to ad +1, so it will correspond to the amount of days th euser might have entered in Days to Event
        $aValues[2] = _DateDiff('D', _NowCalc(), $sDTS) + 1
        DBHandle('AddDefEvent', $aValues)
;~      IniWriteSection($g_sSetFile, _StringToHex(GUICtrlRead($idAddEvent + 4)), $aValues) ; Write the info to Settings file
    EndIf
    hWnd_Close() ; Close the gui
    
    If $g_aEvents[0][1] = Null Then
        UpdateGui(True) ; Update Countdown GUI with Msg
    Else
        UpdateGui(False) ; Update Countdown GUI without msg
    EndIf

EndFunc   ;==>idBtn_AddEventClick

Func idBtn_UpdateEventClick()
    
    ; First we handle the inputs etc.
    ; Read data from gui, and add it to an array
    Local $sReadName = GUICtrlRead($idEditEvent + 4) ; Read name from Event name input
    If $sReadName = '' Then
        MsgBox(BitOR($MB_ICONERROR, $MB_SETFOREGROUND, $MB_TOPMOST), 'Event Name Error', 'The input "Event name" was empty!' & _
                @CRLF & 'Please enter type an Event name!!')
        GUICtrlSetState($idEditEvent + 4, $GUI_FOCUS)
        Return
    EndIf

    ; Handel state of checkbox
    Switch (GUICtrlRead($idEditEvent + 7) = $GUI_CHECKED) ? True : False
        Case True
            ; Get DTS from date picker
            Local $sDTS = GUICtrlRead($idEditEvent + 13)
        Case False
            ; Check that days is not empty
            Local $sReadDays = GUICtrlRead($idEditEvent + 9)
            If $sReadDays <> '' Then
                Local $sDTS = CalcEndDate($sReadDays, GUICtrlRead($idEditEvent + 11))
            Else
                MsgBox(BitOR($MB_ICONERROR, $MB_SETFOREGROUND, $MB_TOPMOST), 'Days Error', 'The input "Days to event" was empty!' & _
                        @CRLF & 'Please enter number of days!!')
                GUICtrlSetState($idEditEvent + 9, $GUI_FOCUS)
                Return
            EndIf
    EndSwitch
    
    ; Create an array to hold the Event values
    Local $aValues[8][2]
    $aValues[0][0] = _GUICtrlListView_GetItemText($idEditEvent + 2, Int(GUICtrlRead($idEditEvent))) ; RowID to update
    $aValues[0][1] = ''
    $aValues[1][0] = 'Name'
    $aValues[1][1] = $sReadName ; Event Name
    $aValues[2][0] = 'Desc'
    $aValues[2][1] = StringReplace(GUICtrlRead($idEditEvent + 6), @CRLF, ' ') ; Get data from edit
    $aValues[3][0] = 'EndDate'
    $aValues[3][1] = StringRegExpReplace($sDTS, "(\d{4})/(\d{2})/(\d{2})(.*)", "$1-$2-$3$4") ; Event end date
    $aValues[4][0] = 'SoundFile'
    $aValues[4][1] = GUICtrlRead($idEditEvent + 15) ; Get sound to play from input sound to play
    $aValues[5][0] = 'PlaySound'
    $aValues[5][1] = (GUICtrlRead($idEditEvent + 17) = $GUI_CHECKED) ? True : False ; To play or not play sound at event end
    $aValues[6][0] = 'PopUp'
    $aValues[6][1] = (GUICtrlRead($idEditEvent + 18) = $GUI_CHECKED) ? True : False ; To show or not to show popup at event end
    $aValues[7][0] = 'Enabled'
    $aValues[7][1] = (GUICtrlRead($idEditEvent + 19) = $GUI_CHECKED) ? True : False ; If enabled or not enabled
    ; Update the DataBase with the new event data
    DBHandle('UpdateEvent', $aValues)
    ; And close the database
    DBHandle('CloseDB', '')
    GUISwitch($hEditEvent)
    ; Close the Edit event gui
    hWnd_Close()
    ; Update the CDD GUI using False, this will tricker the del ctrls to recreate the gui with the updated info
    UpdateGui(False)
    
EndFunc   ;==>idBtn_UpdateEventClick

Func idBtn_EventDeleteClick()
    ; Deletes the selected Event from the Events.ini file and if it's current active in the CountDown GUI
    ; refreshes the gui to remove it from that also
    ; Get the selected Event data
    ; $aData[1] = RowID, [2] = Name, [3] = End Date and [4] = Enabled (True/False)
    Local $aData = StringSplit(StringTrimRight(GUICtrlRead(GUICtrlRead($idDelEvent + 2)), 1), '|')
    If @error Then
        Return SetError(-1)
    EndIf
    ; Then we warn the user that the event will be deletede
    If MsgBox(BitOR($MB_YESNO, $MB_TOPMOST, $MB_SETFOREGROUND, $MB_ICONWARNING), 'Delete Event', 'The Event: "' & $aData[2] & '"' & @CRLF & _
            'with end date: "' & $aData[3] & '"' & @CRLF & 'will be deletede!' & @CRLF & @CRLF & 'Do you want to continue?') = $IDNO Then Return
    
    ; Delete the event from DataBase
    DBHandle('DelEvent', $aData[1])
    DBHandle('CloseDB', '')

    ; Check if the event is active in the CountDownGUI, by checking if it's located in the Event array.
    ; We search for the rowid in the aEvents array, at column 0, and if found we updates the gui
    ; If the deletede event was Enabled we upadte the GUI
    If StringToType($aData[4]) = True Then UpdateGui(False)

    ; Check if Max events is lessere that current enabled events
    If UBound($g_aEvents) - 1 < $g_aSettings[$eSet_Max] Then GUICtrlSetState($MenuItem_AddEvent, $GUI_ENABLE)
EndFunc   ;==>idBtn_EventDeleteClick


Func idBtn_SoundBrowseClick()
    ; Sound file browser
    
    ; Display an open dialog to select a list of file(s).
    Local $iExStyle = BitOR($OFN_PATHMUSTEXIST, $OFN_FILEMUSTEXIST)
    Local $sAudioFile = _WinAPI_OpenFileDlg('', @WorkingDir, 'Audio (*.wav;*.mp3)', 1, '', '', $iExStyle)
    
    ; We only add if there is something to add
    If $sAudioFile <> '' Then
        GUICtrlSetData(@GUI_CtrlId - 1, $sAudioFile)
        GUICtrlSetTip(@GUI_CtrlId - 1, $sAudioFile)
    EndIf

EndFunc   ;==>idBtn_SoundBrowseClick

Func EventListView()
    ; Handle Edit event ListView double clicks
    ; When a user double clicks on an item in the listview, the WM_NOTIFY sends item index
    ; to the $idEditEvent dummy
    ; Error handle
    Local $sitem = _GUICtrlListView_GetItemText($idEditEvent + 2, Int(GUICtrlRead($idEditEvent)))
    If $sitem = '' Then Return SetError(-1)
    ; Get Event data from the DataBase
    Local $aData = DBHandle('GetSingleEvent', $sitem)
    ; Set data to gui
    ; Add the data to the inputs
    GUICtrlSetData($idEditEvent + 4, $aData[1]) ; Add the name to Event Name input
    GUICtrlSetData($idEditEvent + 6, $aData[2]) ; Add Description
    GUICtrlSetData($idEditEvent + 13, $aData[3]) ; Add end date of event
    GUICtrlSetData($idEditEvent + 15, $aData[4]) ; Add the sound
    GUICtrlSetTip($idEditEvent + 15, $aData[4])
    
    ;Update the state of the checkboxes
    CbSetState($idEditEvent + 17, StringToType($aData[5])) ; PlaySound checkbox
    CbSetState($idEditEvent + 18, StringToType($aData[6])) ; Popup Checkbox
    CbSetState($idEditEvent + 19, StringToType($aData[7])) ; Enabled checkbox
    
    ; Enables controls
    GUICtrlSetState($idEditEvent + 4, $GUI_ENABLE) ; Event name
    GUICtrlSetState($idEditEvent + 6, $GUI_ENABLE) ; Event description
    GUICtrlSetState($idEditEvent + 7, $GUI_ENABLE) ; Checkbox choose by date
    GUICtrlSetState($idEditEvent + 13, $GUI_ENABLE) ; Date picker
    GUICtrlSetState($idEditEvent + 15, $GUI_ENABLE) ; Sound to play
    GUICtrlSetState($idEditEvent + 16, $GUI_ENABLE) ; Button Sound Browse
    GUICtrlSetState($idEditEvent + 17, $GUI_ENABLE) ; Checkbox play sound
    GUICtrlSetState($idEditEvent + 18, $GUI_ENABLE) ; Checkbox Popup
    GUICtrlSetState($idEditEvent + 19, $GUI_ENABLE) ; Checkbox Enabled
    GUICtrlSetState($idEditEvent + 20, $GUI_ENABLE) ; Update button
    
EndFunc   ;==>EventListView

Func idCombo_EventsChange()
    ; Here we handle the combo changes for Add events
    
    ; First we read the combo
    Local $sRead = GUICtrlRead($idAddEvent + 2)
    ; Now we get the default event data from the DataBase, using the index +1 of the selected event
    Local $aData = DBHandle('GetSingleDefEvent', _GUICtrlComboBox_GetCurSel($idAddEvent + 2) + 1)
    _ArrayDisplay($aData, 'Selected in combo')
    ; Close the DataBase
    DBHandle('CloseDB', '')

    ; Add the data to the inputs
    GUICtrlSetData($idAddEvent + 4, $aData[0]) ; Add Name of event to input
    GUICtrlSetData($idAddEvent + 6, $aData[1]) ; Add Description to the edit
    GUICtrlSetData($idAddEvent + 9, $aData[2]) ; Add number of days to input
    GUICtrlSetData($idAddEvent + 15, $aData[3]) ; Add sound to input
    GUICtrlSetTip($idAddEvent + 15, $aData[3]) ; Set sound tip (to show full path on hover)
    ; Set the state of Soundplay
    CbSetState($idAddEvent + 17, StringToType($aData[4]))
    ; Set the state of popup checkbox
    CbSetState($idAddEvent + 18, StringToType($aData[5]))

EndFunc   ;==>idCombo_EventsChange

Func UpdateGui($bStart = True)
    ; Adds events to the main gui
    ; Check if we have an event to add to the gui
    If $g_aEvents[0][1] = Null And $bStart = False Then Return ; If we don't have any events
    ; If the function is called with False, we deletes all controls
    If $bStart = False Then
        ; Delete existing controls, so we can recreate them
        For $i = 1 To UBound($g_aEvents) - 1
            GUICtrlDelete($g_idLbl_Event[$i]) ; Delete the Event Name Label
            GUICtrlDelete($g_idLbl_Days[$i]) ; Deletes the label Days Counter
            GUICtrlDelete($g_idLbl_Days[$i] + 1) ; Deletes the label Days
            GUICtrlDelete($g_idLbl_Days[$i] + 2) ; Deletes the label we use as a frame for the gui
            GUICtrlDelete($g_idLbl_Hrs[$i]) ; Deletes the label Hrs counter
            GUICtrlDelete($g_idLbl_Hrs[$i] + 1) ; Deletes the label : after hrs
            GUICtrlDelete($g_idLbl_Min[$i]) ; Deletes the label min counter
            GUICtrlDelete($g_idLbl_Min[$i] + 1) ; Deletes the label : after min
            GUICtrlDelete($g_idLbl_Sec[$i]) ; Deletes the label sec counter
            GUICtrlDelete($g_idLbl_Sec[$i] + 1) ; Deletes the label we use as frame around the time counter
            GUICtrlDelete($g_idLbl_Sec[$i] + 2) ; Deletes the Group we use as spacer
            
        Next
        
    EndIf
    $g_aEvents = DBHandle('GetEvents', $g_iInstance) ; reload the array
    DBHandle('CloseDB', '')
    ; Check if there is any events
    If UBound($g_aEvents) = 1 Then
        $g_aEvents[0][0] = 1
        $g_aEvents[0][1] = Null
        Return
    EndIf

    ; Updates the global GUIHeight
    $g_iGuiHeight = ($g_iSpace * (UBound($g_aEvents) - 1)) + 8
    ; Switch to the CDD gui, else the labels would be created on the last active gui
    GUISwitch($hCountdownDays)
    For $i = 1 To UBound($g_aEvents) - 1
        ; Adds the events to the Countdown gui
        $g_idLbl_Event[$i] = GUICtrlCreateLabel($g_aEvents[$i][$eEvent_Name], 8, 14 + (($i - 1) * $g_iSpace), 119, 20, $SS_CENTER)
        GUICtrlSetFont(-1, 12, 400, 0, "Arial Narrow")
        GUICtrlSetColor(-1, $g_aColors[$eCol_Name]) ; Navy blue
        GUICtrlSetTip(-1, SplitText($g_aEvents[$i][$eEvent_Desc], 45), 'Description:', 1, 1)
        $g_idLbl_Days[$i] = GUICtrlCreateLabel("", 31, 34 + (($i - 1) * $g_iSpace), 32, 20, $SS_RIGHT)
        GUICtrlSetFont(-1, 14, 800, 0, "Arial Narrow")
        GUICtrlCreateLabel("Days", 65, 34 + (($i - 1) * $g_iSpace), 34, 20)
        GUICtrlSetFont(-1, 14, 400, 0, "Arial Narrow")
        GUICtrlSetColor(-1, $g_aColors[$eCol_DaysLbl])
        ; Create a static lable to frame the Time countdown
        GUICtrlCreateLabel("", 16, 56 + (($i - 1) * $g_iSpace), 102, 26, BitOR($SS_GRAYFRAME, $WS_DISABLED, $SS_SUNKEN))
        $g_idLbl_Hrs[$i] = GUICtrlCreateLabel("", 22, 58 + (($i - 1) * $g_iSpace), 18, 20, $SS_CENTER)
        GUICtrlSetFont(-1, 14, 800, 0, "Arial Narrow")
        GUICtrlCreateLabel(":", 46, 58 + (($i - 1) * $g_iSpace), 8, 20)
        GUICtrlSetColor(-1, $g_aColors[$eCol_TimeColon])
        GUICtrlSetFont(-1, 14, 800, 0, "Arial Narrow")
        $g_idLbl_Min[$i] = GUICtrlCreateLabel("", 56, 58 + (($i - 1) * $g_iSpace), 18, 20, $SS_CENTER)
        GUICtrlSetFont(-1, 14, 800, 0, "Arial Narrow")
        GUICtrlCreateLabel(":", 80, 58 + (($i - 1) * $g_iSpace), 8, 20)
        GUICtrlSetColor(-1, $g_aColors[$eCol_TimeColon])
        GUICtrlSetFont(-1, 14, 800, 0, "Arial Narrow")
        $g_idLbl_Sec[$i] = GUICtrlCreateLabel("", 90, 58 + (($i - 1) * $g_iSpace), 18, 20, $SS_CENTER)
        GUICtrlSetFont(-1, 14, 800, 0, "Arial Narrow")
        
        ; We add a horizontal line as a spacer between the events, but only if we have more that one. But we don't add one after the last
        If $i >= 1 And $i < UBound($g_aEvents) - 1 And UBound($g_aEvents) - 1 > 1 Then
            GUICtrlCreateGroup("", 0, 84 + (($i - 1) * $g_iSpace), 135, 9)
            GUICtrlCreateGroup("", -99, -99, 1, 1)
        EndIf
        $g_idLbl_Event[0] = $i
    Next
    ; Resizes the Frame label
    GUICtrlSetPos($idFrame, 0, 0, 136, $g_iGuiHeight + 4)
    ; Get the position of the Countdown gui
    Local $aWinPos = WinGetPos($hCountdownDays)

    ; Updates the height of the Countdown gui, using the pos we got, and the new height using the updated global guiheight
    _WinAPI_SetWindowPos($hCountdownDays, $HWND_NOTOPMOST, $aWinPos[0], $aWinPos[1], 136, $g_iGuiHeight + 4, _
            BitOR($SWP_NOACTIVATE, $SWP_NOMOVE, $SWP_NOZORDER))
    
    ; Finaly we checks if we have exceeded or maxed out the allowed amounts of Events.
    ; If so we disables the add event MenuItem, thereby preventing the user to add more events, until
    ; an Event is either disabled or deleted, making up space for a new one.
    If UBound($g_aEvents) - 1 >= $g_aSettings[$eSet_Max] Then GUICtrlSetState($MenuItem_AddEvent, $GUI_DISABLE)
EndFunc   ;==>UpdateGui

Func CbSetState($iCtrlID, $bEnabled)
    Switch $bEnabled ; Popup checkbox
        Case True
            GUICtrlSetState($iCtrlID, $GUI_CHECKED)
        Case False
            GUICtrlSetState($iCtrlID, $GUI_UNCHECKED)
    EndSwitch
EndFunc   ;==>CbSetState

Func Countdown()
    If $g_aEvents[0][1] = Null Then Return ; If we don't have any events
    For $i = 1 To UBound($g_aEvents) - 1
        ; cycle through events
        Local $iGetSec = _DateDiff('s', _NowCalc(), StringRegExpReplace($g_aEvents[$i][$eEvent_Date], "(\d{4})-(\d{2})-(\d{2})(.*)", "$1/$2/$3$4"))
        
        ; grab seconds of difference from now to future date
        If $iGetSec <= 0 And StringToType($g_aEvents[$i][$eEvent_Enabled]) = True Then
            EventHandle($g_aEvents[$i][$eEvent_RowID], $i)
        EndIf
        Ticks_To_Time($iGetSec, $g_iDays, $g_iHours, $g_iMins, $g_iSecs)
        If @error Then
            ; If time is up, we update days,hours, min and sec. This it to prevent false time/day update of the event, sins TTT uses byref and
            ; if we don't update the var's the event counter would be equal to the previous event time.
            $g_iDays = 0
            $g_iHours = '00'
            $g_iMins = '00'
            $g_iSecs = '00'
        EndIf
        ; convert seconds to days/hours/minutes/seconds
        
        ; set color and data
        Switch $g_iDays
            Case 0 To 5
                GUICtrlSetDataAndColor($g_idLbl_Days[$i], $g_iDays, 1) ; Red
            Case 6 To 10
                GUICtrlSetDataAndColor($g_idLbl_Days[$i], $g_iDays, 2) ; Yellow
            Case 11 To 15
                GUICtrlSetDataAndColor($g_idLbl_Days[$i], $g_iDays, 3) ; Green
            Case Else
                GUICtrlSetDataAndColor($g_idLbl_Days[$i], $g_iDays, 0) ; Black
        EndSwitch
        ; If days = 0 we want to change the timer colors
        If $g_iDays = 0 Then
            Switch $g_iHours
                Case 0 To 6
                    GUICtrlSetDataAndColor($g_idLbl_Hrs[$i], $g_iHours, 5) ; Red
                    GUICtrlSetDataAndColor($g_idLbl_Min[$i], $g_iMins, 5) ; Red
                    GUICtrlSetDataAndColor($g_idLbl_Sec[$i], $g_iSecs, 5) ; Red
                Case 7 To 12
                    GUICtrlSetDataAndColor($g_idLbl_Hrs[$i], $g_iHours, 6) ; Yellow
                    GUICtrlSetDataAndColor($g_idLbl_Min[$i], $g_iMins, 6) ; Yellow
                    GUICtrlSetDataAndColor($g_idLbl_Sec[$i], $g_iSecs, 6) ; Yellow
                Case 13 To 23
                    GUICtrlSetDataAndColor($g_idLbl_Hrs[$i], $g_iHours, 7) ; Green
                    GUICtrlSetDataAndColor($g_idLbl_Min[$i], $g_iMins, 7) ; Green
                    GUICtrlSetDataAndColor($g_idLbl_Sec[$i], $g_iSecs, 7) ; Green
            EndSwitch
        Else ; If not we just keep them black
            GUICtrlSetDataAndColor($g_idLbl_Hrs[$i], $g_iHours, 4) ; Black
            GUICtrlSetDataAndColor($g_idLbl_Min[$i], $g_iMins, 4) ; Black
            GUICtrlSetDataAndColor($g_idLbl_Sec[$i], $g_iSecs, 4) ; Black
        EndIf
    Next
EndFunc   ;==>Countdown

Func EventHandle($iRowID, $iIndex)
    ; Here we handles the event when it's time is up o_O
    ConsoleWrite(@CRLF & 'Event Handle' & @CRLF)
    ; First we disable the event, to prevent it from caling this function more than once.
    $g_aEvents[$iIndex][$eEvent_Enabled] = False

    DBHandle('UpdateEventStatus', 'Enabled|False|' & $iRowID)
    DBHandle('CloseDB', '')
    ; Set background label of the event to Yellow and text to Red - Indicate that the event is up
    GUICtrlSetColor($g_idLbl_Event[$iIndex], $g_aColors[$eCol_EventUp])
    GUICtrlSetBkColor($g_idLbl_Event[$iIndex], $g_aColors[$eCol_EventUpBk])
    
    ; Check if a sound should be played
    If StringToType($g_aEvents[$iIndex][$eEvent_SoundPlay]) = True Then SoundPlay($g_aEvents[$iIndex][$eEvent_SoundFile])
    
    ; Check if a popup should be displayed
    If StringToType($g_aEvents[$iIndex][$eEvent_Pop]) = True Then
        ; Disable the on event mode, else the GuiGetMsg won't work
        Opt("GUIOnEventMode", 0)
        ; Create the popup window
        Local $iStyle = BitOR($WS_SYSMENU, $WS_POPUP, $DS_SETFOREGROUND, $WS_CAPTION)
        Local $iExStyle = BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW)
        Local $hPopup = GUICreate($g_aEvents[$iIndex][$eEvent_Name], 405, 285, Default, Default, $iStyle, $iExStyle)
        Local $idEdit_Popup = GUICtrlCreateEdit("", 11, 8, 385, 233, BitOR($ES_CENTER, $ES_READONLY, $ES_WANTRETURN, $WS_VSCROLL))
        ; Set the Event description test to the edit
        GUICtrlSetData(-1, @CRLF & SplitText($g_aEvents[$iIndex][$eEvent_Desc]), 45)
        GUICtrlSetBkColor(-1, $g_aColors[$eCol_GuiBk])
        GUICtrlSetFont(-1, 18, 800, 0, "Arial Narrow") ; Boost the font size
        Local $idBtn_OK = GUICtrlCreateButton("OK", 165, 256, 75, 21, $BS_DEFPUSHBUTTON)
        GUISetState(@SW_SHOW)

        While 1
            Local $nMsg = GUIGetMsg()
            Switch $nMsg
                Case $GUI_EVENT_CLOSE, $idBtn_OK
                    SoundPlay('') ; Kill the sound if any
                    GUIDelete($hPopup) ; Delete the gui
                    ExitLoop ; And exit loop
            EndSwitch
        WEnd
        Opt("GUIOnEventMode", 1) ; Reenable OnEventMode
    EndIf
    
    GUICtrlSetOnEvent($g_idLbl_Event[$iIndex], 'Click_Main')
EndFunc   ;==>EventHandle

Func DBHandle($sHandle, ByRef $vData)
    ConsoleWrite(@CRLF & 'DBHandle call = ' & $sHandle & @CRLF)
    ; Here we handle all SQLite handles
    ; Open/Close DataBase, Update/Change Settings, Add/Edit/Delete Events Add/Delete Default Events
    
    ; Create a static var to handle open close of the database
    Local Static $bOpen = True
    If $bOpen Then
        $bOpen = False ; Change the static to False, so we don't continues to open the database - when it hasn't been closed
        Local $g_hDB = _SQLite_Open($g_sDBFile) ; Open the SQLite database
        If @error Then
            MsgBox($g_iMBErr, "SQLite Error", "Can't open Database!")
            Exit -1
        EndIf
    EndIf
    ; Switch thru the handles
    Switch $sHandle
        Case 'ByString'
            SQLite_QuerryArrayByString($vData)
        Case 'GetSet'
            ; Getting settings from the DB
            Local $aData2D = SQLite_QuerryArray('Settings', $vData)
            ; Error checker to prevent empty array
            If UBound($aData2D) = 1 Then
                Return SetError(-1)
            EndIf
            ;Stripping first row, colum 0 and 1 (RowID and Instance) and convert the array to 1D
            Local $aData1D[0]
            For $i = 0 To UBound($aData2D, $UBOUND_COLUMNS) - 1
                _ArrayAdd($aData1D, StringToType($aData2D[1][$i]))
            Next
            ; Return the 1D Settings array
            Return $aData1D
        Case 'GetColors'
            ; Get color settings
            Local $aData2D = SQLite_QuerryArray('Colors', $vData)
            If UBound($aData2D) = 1 Then
                Return SetError(-1)
            EndIf
            ;Stripping first row, colum 0 and 1 (RowID and Instance) and convert the array to 1D
            Local $aData1D[0]
            For $i = 0 To UBound($aData2D, $UBOUND_COLUMNS) - 1
                _ArrayAdd($aData1D, $aData2D[1][$i])
            Next
            ; Return the 1D Settings array
            Return $aData1D
        Case 'UpdateSet'
            ; Updates the settings and colors in the DataBase
            ; First we creates a 2D array for Settings and Colors
            Local $aSetCol = StringSplit($g_aSettings[$eSet_RowID] & '|Instance|Max|Remember|SoundPlay|PopUp|Start|Lang|SoundFile|PosLeft|PosTop', '|')
            Local $aColCol = StringSplit($g_aColors[$eCol_RowID] & '|Instance|GuiBk|DragLbl|Name|DaysCount0|DaysCount1|DaysCount2|DaysCount3|' & _
                    'DaysLbl|Time0|Time1|Time2|Time3|TimeColon|EventUp|EventUpBk', '|')
            Local $aSet[$aSetCol[0]][2], $aCol[$aColCol[0]][2]
            ; Create Settings 2D array
            For $i = 0 To $aSetCol[0] - 1
                $aSet[$i][0] = $aSetCol[$i + 1]
                $aSet[$i][1] = $g_aSettings[$i]
            Next
            ; Create colors 2D array
            For $i = 0 To $aColCol[0] - 1
                $aCol[$i][0] = $aColCol[$i + 1]
                $aCol[$i][1] = $g_aColors[$i]
            Next
            ; Update the DataBase
            SQLite_UpdateByArray('Settings', $aSet)
            SQLite_UpdateByArray('Colors', $aCol)
        Case 'UpdatePos'
            ; Update the Position
            SQLite_UpdateByArray('Settings', $vData)
        Case 'GetEvents'
            ; Get all enabled events, for the current instance
            Return SQLite_QuerryArray('EventsEnabled', $vData)
        Case 'GetAllEvents'
            ; Get all events for this instance, enabled and disabled
            Local $aData = SQLite_QuerryArray('Events', $vData)
            If UBound($aData) = 1 Then
                Return SetError(-1)
            Else
                Return $aData
            EndIf
        Case 'GetSingleEvent'
            ; Get a single event
            Local $aData = SQLite_QuerryRow('Events', $vData)
            If UBound($aData) = 0 Then
                Return SetError(-1)
            Else
                Return $aData
            EndIf
        Case 'AddEvent'
            ; Add an event to the DataBase
            SQLite_AddByArray('Events', $vData)
        Case 'DelEvent'
            ; Delete a single event.
            SQLite_DelSingle('Events', $vData)
        Case 'UpdateEvent'
            ; Update a single event
            SQLite_UpdateByArray('Events', $vData)
        Case 'UpdateEventStatus'
            ; Updates a single coloum
            Local $aData = StringSplit($vData, '|')
            SQLite_UpdateSingle('Events', $aData[1], StringToType($aData[2]), $aData[3])
        Case 'AddDefEvent'
            ; Adds a single default event to the DataBase
            SQLite_AddByArray('DefEvents', $vData)
        Case 'UpdateDefEvent'
            ; Updates a singel default event in the DataBase
            SQLite_UpdateByArray('DefEvents', $vData)
        Case 'GetDefEvents'
            ; Get all default evnets from the DataBase
            Return _ArrayExtract(SQLite_QuerryArray('DefEvents', ''), 1)
        Case 'GetSingleDefEvent'
            ; Get a single default event from the DataBase
            Return SQLite_QuerryRow('DefEvents', $vData)
        Case 'DelSingleDefEvent'
            ; Deletes a single Default event from teh DataBase
            SQLite_DelSingle('DefEvents', $vData)
        Case 'UpdateSingleSet'
            ; Updates a single coloum
            Local $aData = StringSplit($vData, '|')
            SQLite_UpdateSingle('Settings', $aData[1], StringToType($aData[2]), $g_aSettings[$eSet_RowID])
            ContinueCase ; We continues case so the database is closed
        Case 'CloseDB'
            ConsoleWrite(@CRLF & 'DataBase was closed' & @CRLF)
            $bOpen = True ; Set static to True, so when the function is called next time, the datbase is opened
            _SQLite_Close() ; Close the database
        Case 'VACUUM'
            SQLite_Vacuum()
    EndSwitch

EndFunc   ;==>DBHandle
Func SQLite_QuerryArrayByString($sString)
    Local $aResult, $iRows, $iColumns, $iRval
    
        $iRval = _SQLite_GetTable2D(-1, $sString, $aResult, $iRows, $iColumns)

    If $iRval = $SQLITE_OK Then
        Return $aResult
    EndIf
    MsgBox(0, 'title', _SQLite_ErrMsg())
    
EndFunc
Func SQLite_UpdateSingle($sTable, $sColum, $vData, $iRowID)
    ; We update a single columm by using the colum name and the rowid
    ; First we check if the data we should update is Boolean, we check this course if we try to fastescape
    ; a boolean value, sqlite gives an error
    If IsBool($vData) Then
        $vData = "'" & $vData & "'"
    Else
        $vData = _SQLite_FastEscape($vData) ; It's not boolean
    EndIf
    ; Update Database
    _SQLite_Exec(-1, "UPDATE " & $sTable & " SET " & $sColum & " = " & $vData & " WHERE rowid=" & $iRowID & ";")
    
EndFunc   ;==>SQLite_UpdateSingle

Func SQLite_AddByArray($sTable, $aData)
    ; Add data to the DataBase using an array
    
    For $i = 0 To UBound($aData) - 1
        ; Create a string of data to add to the database
        Local $sData
        ; First we check if that data it boolean
        If IsBool($aData[$i]) Then
            ; The data was boolean, so we update without using fastecsape
            $sData &= "'" & $aData[$i] & "', "
        Else
            $sData &= _SQLite_FastEscape($aData[$i]) & ', '

        EndIf
    Next
    _SQLite_Exec(-1, "INSERT INTO " & $sTable & " VALUES ( " & StringTrimRight($sData, 2) & ");")
EndFunc   ;==>SQLite_AddByArray

Func SQLite_UpdateByArray($sTable, ByRef $aData)
    ; Update DataBase using a 2d array, where [0] is column name and [1] is the data to set
    Local $iRowID = $aData[0][0]
    For $i = 1 To UBound($aData) - 1
        ; First we check if that data it boolean
        If IsBool($aData[$i][1]) Then
            ; The data was boolean, so we update without using fastecsape
            _SQLite_Exec(-1, "UPDATE " & $sTable & " SET " & $aData[$i][0] & " = '" & $aData[$i][1] & "' WHERE rowid=" & $iRowID & ";")
        Else
            ; We update using fastescape
            _SQLite_Exec(-1, "UPDATE " & $sTable & " SET " & $aData[$i][0] & " = " & _SQLite_FastEscape($aData[$i][1]) & " WHERE rowid=" & $iRowID & ";")
        EndIf
    Next
EndFunc   ;==>SQLite_UpdateByArray

Func SQLite_DelSingle($sTable, $iRowID)
    ; Delete a singel row from the table
    _SQLite_Exec(-1, "DELETE FROM " & $sTable & " WHERE rowid=" & $iRowID & ";")

EndFunc   ;==>SQLite_DelSingle

Func SQLite_DelByInstance($sTable, $iInst)
    ; Delete a singel row from the table
    _SQLite_Exec(-1, "DELETE FROM " & $sTable & " WHERE Instance=" & $iInst & ";")

EndFunc   ;==>SQLite_DelSingle

Func SQLite_Vacuum()
    ; Reset the rowid values, and rebuild the index from the scratch
    _SQLite_Exec(-1, "VACUUM;")
EndFunc   ;==>SQLite_Vacuum

Func SQLite_QuerryArray($sTable, $iInst)
    Local $aResult, $iRows, $iColumns, $iRval
    If $sTable = 'EventsEnabled' Then
        $iRval = _SQLite_GetTable2D(-1, 'SELECT rowid,* FROM Events WHERE Instance=' & $iInst & " AND Enabled='True';", $aResult, $iRows, $iColumns)
    ElseIf $sTable = 'DefEvents' Then
        $iRval = _SQLite_GetTable2D(-1, 'SELECT rowid,* FROM "' & $sTable & '";', $aResult, $iRows, $iColumns)
    Else
        $iRval = _SQLite_GetTable2D(-1, 'SELECT rowid,* FROM "' & $sTable & '" WHERE Instance=' & $iInst & ';', $aResult, $iRows, $iColumns)
    EndIf
    If $iRval = $SQLITE_OK Then
        Return $aResult
    EndIf
    MsgBox(0, 'title', _SQLite_ErrMsg())
EndFunc   ;==>SQLite_QuerryArray

Func SQLite_QuerryRow($sTable, $iRowID)
    Local $aRow
    _SQLite_QuerySingleRow(-1, "SELECT * FROM " & $sTable & " WHERE rowid=" & $iRowID & ";", $aRow) ; Select single row
    Return $aRow
EndFunc   ;==>SQLite_QuerryRow

Func SQLite_QuerrySingle($sTable, $sColum, $iRowID)
    Local $aRow
    _SQLite_QuerySingleRow(-1, "SELECT " & $sColum & " FROM " & $sTable & " WHERE rowid=" & $iRowID & ";", $aRow) ; Select single field !
    Return $aRow
EndFunc   ;==>SQLite_QuerrySingle

Func CreateDB()
    ; Create DataBase
    Local $sTables
    $sTables &= 'CREATE TABLE [Colors]('
    $sTables &= '[Instance] INT,'
    $sTables &= '[GuiBk] VARCHAR,'
    $sTables &= '[DragLbl] VARCHAR,'
    $sTables &= '[Name] VARCHAR,'
    $sTables &= '[DaysCount0] VARCHAR,'
    $sTables &= '[DaysCount1] VARCHAR,'
    $sTables &= '[DaysCount2] VARCHAR,'
    $sTables &= '[DaysCount3] VARCHAR,'
    $sTables &= '[DaysLbl] VARCHAR,'
    $sTables &= '[Time0] VARCHAR,'
    $sTables &= '[Time1] VARCHAR,'
    $sTables &= '[Time2] VARCHAR,'
    $sTables &= '[Time3] VARCHAR,'
    $sTables &= '[TimeColon] VARCHAR,'
    $sTables &= '[EventUp] VARCHAR,'
    $sTables &= '[EventUpBk] VARCHAR);'

    $sTables &= 'CREATE TABLE[Events]('
    $sTables &= '[Instance] INT,'
    $sTables &= '[Name] VARCHAR,'
    $sTables &= '[Desc] VARCHAR,'
    $sTables &= '[EndDate] DATETIME,'
    $sTables &= '[SoundFile] VARCHAR,'
    $sTables &= '[PlaySound] BOOLEAN,'
    $sTables &= '[PopUp] BOOLEAN,'
    $sTables &= '[Enabled] BOOLEAN);'

    $sTables &= 'CREATE TABLE[Position]('
    $sTables &= '[Instance] INT,'
    $sTables &= '[PosLeft] INT,'
    $sTables &= '[PosTop] INT,'
    $sTables &= '[Pin] BOOLEAN);'

    $sTables &= 'CREATE TABLE[DefEvents]('
    $sTables &= '[Name] VARCHAR UNIQUE ON CONFLICT REPLACE,'
    $sTables &= '[Desc] VARCHAR,'
    $sTables &= '[Days] INT,'
    $sTables &= '[SoundFile] VARCHAR,'
    $sTables &= '[PlaySound] BOOLEAN,'
    $sTables &= '[PopUp] BOOLEAN);'

    ; Insert default data
    Local $sDefData
    $sDefData &= "INSERT INTO Position VALUES ('0', -1, -1, 'False');"
    $sDefData &= "INSERT INTO Colors VALUES ('0', '0x4E4E4E','0x808080','0xFFFFFF', '0x000000', '0xFF0000', " & _
            "'0xFFFF00', '0x008000', '0x000000', '0x000000','0xFF0000', '0xFFFF00', '0x008000', '0x000000', '0xFF0000', '0xFFFF00');"
    _SQLite_Open(@ScriptDir & '\Data.db') ; Create the DataBase
    If @error Then
        Return SetError(-1)
    EndIf
    _SQLite_Exec(-1, $sTables)
    If @error Then
        Return SetError(-1)
    EndIf
    _SQLite_Exec(-1, $sDefData)
    If @error Then
        Return SetError(-1)
    EndIf
    _SQLite_Close()
    If @error Then
        Return SetError(-1)
    EndIf
EndFunc   ;==>CreateDB

Func Ticks_To_Time($iSeconds, ByRef $idays, ByRef $iHours, ByRef $iMins, ByRef $iSecs)
    ; second conversion.

    ; modified: added days. added format style, to use 00 for time
    If Number($iSeconds) > 0 Then
        $idays = Int($iSeconds / 86400)

        $iSeconds = Mod($iSeconds, 86400)
        $iHours = StringFormat("%02d", Int($iSeconds / 3600))

        $iSeconds = Mod($iSeconds, 3600)
        $iMins = StringFormat("%02d", Int($iSeconds / 60))

        $iSecs = StringFormat("%02d", Mod($iSeconds, 60))
        Return 1
    Else
        Return SetError(1, 0, 0)
    EndIf
EndFunc   ;==>Ticks_To_Time

Func GUICtrlSetDataAndColor($hWnd, $iCount, $iColor)
    ; Set Day(s), Hour(s), Min(s), Sec(s) and color to the countdown labels
    Local $dColor

    Switch $iColor ; Check if we chould use a color
        Case 0 ; Black <- Default color
            $dColor = $g_aColors[$eCol_Days0]
        Case 1 ; Red
            $dColor = $g_aColors[$eCol_Days1]
        Case 2 ; Yellow
            $dColor = $g_aColors[$eCol_Days2]
        Case 3 ; Green
            $dColor = $g_aColors[$eCol_Days3]
        Case 4
            $dColor = $g_aColors[$eCol_Time0]
        Case 5
            $dColor = $g_aColors[$eCol_Time1]
        Case 6
            $dColor = $g_aColors[$eCol_Time2]
        Case 7
            $dColor = $g_aColors[$eCol_Time3]
    EndSwitch

    If GUICtrlRead($hWnd) <> $iCount Or GUICtrlRead($hWnd) = '' Then
        ; if data is different then change. helps with flickering
        GUICtrlSetData($hWnd, $iCount)
        GUICtrlSetColor($hWnd, $dColor)
    EndIf

EndFunc   ;==>GUICtrlSetDataAndColor

Func CalcEndDate($idays, $sTime)
    ; Calculates a new date by adding a specified number of Days to an initial date
    Return _DateAdd('D', $idays, @YEAR & '/' & @MON & '/' & @MDAY & ' ' & $sTime)
EndFunc   ;==>CalcEndDate


Func StringToType(ByRef $vData)
    ; Converts a string to bool, Number or KeyWord
    Local $aData = StringRegExp($vData, "(?i)\bTrue\b|\bFalse\b|\bNull\b|\bDefault\b", 3)
    If Not IsArray($aData) Then Return $vData
    Switch $aData[0]
        Case 'True'
            Return True
        Case 'False'
            Return False
        Case 'Null'
            Return Null
        Case 'Default'
            Return Default
        Case Else
            Return Int($aData[0])
    EndSwitch
EndFunc   ;==>StringToType

Func SplitText($sString, $iLenght = 45)
    #cs
        This splits a large text up into cunks at N lengt, at the last space within the nLength specified, and seperated with a @CRLF
        eg. 'A child asked his father, "How were people born?" So his father said, "Adam and Eve made babies, then their babies became adults and made babies, and so on."
        Would be formated as this:
        A child asked his father, "How were people born?" So his father said, "Adam and Eve
        made babies, then their babies became adults and made babies, and so on."
    #ce
    Local $sResult = StringRegExpReplace($sString, ".{1," & $iLenght - 1 & "}\K(\s{1,2}|$)", @CRLF)
    Return $sResult
EndFunc   ;==>SplitText

Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $iwParam

    Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView_EditEvent, $tInfo, $iRowID, $aData
    $hWndListView_EditEvent = GUICtrlGetHandle($idEditEvent + 2)
    $tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
    $hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
    $iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
    $iCode = DllStructGetData($tNMHDR, "Code")
    Switch $hWndFrom
        Case $hWndListView_EditEvent
            Switch $iCode
                Case $NM_DBLCLK ; Sent by a list-view control when the user double-clicks an item with the left mouse button
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
                    ; Get index of selected Event, and call the listview handle
                    GUICtrlSendToDummy($idEditEvent, DllStructGetData($tInfo, "Index"))
            EndSwitch

    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Other suggestions, on how to make my code more effective, is also welcome :)

 

Cheers
/Rex

Edited by Rex

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...