function LeoAltholicChecklistUI.normalizeSettings()
    if not LeoAltholic.globalData.checklist then LeoAltholic.globalData.checklist = {} end
    if not LeoAltholic.globalData.settings.checklist then LeoAltholic.globalData.settings.checklist = {} end
    if not LeoAltholic.charData.settings.checklist then LeoAltholic.charData.settings.checklist = {} end
end

function LeoAltholicChecklistUI.SetPosition(left, top)
    LeoAltholic.globalData.checklist.position = {
        left = left,
        top = top
    }
end
function LeoAltholicChecklistUI.GetPosition()
    return LeoAltholic.globalData.checklist.position or { left = 950; top = 42; }    --TevaNOTE was: { left = 100; top = 200; }
end

function LeoAltholicChecklistUI.SetFontScale(value)
    LeoAltholic.globalData.settings.checklist.fontScale = value
    LeoAltholicChecklistUI.update()
end
function LeoAltholicChecklistUI.GetFontScale()
    return LeoAltholic.globalData.settings.checklist.fontScale or 100
end
function LeoAltholicChecklistUI.SetMinimized(value)
    LeoAltholic.globalData.settings.checklist.minimized = value
end
function LeoAltholicChecklistUI.IsMinimized()
    if LeoAltholic.globalData.settings.checklist.minimized == nil then LeoAltholic.globalData.settings.checklist.minimized = false end
    return LeoAltholic.globalData.settings.checklist.minimized
end
function LeoAltholicChecklistUI.SetDisplayName(value)
    LeoAltholic.globalData.settings.checklist.displayName = value
    LeoAltholicChecklistUI.update()
end
function LeoAltholicChecklistUI.DisplayName()
    if LeoAltholic.globalData.settings.checklist.displayName == nil then LeoAltholic.globalData.settings.checklist.displayName = false end    --TevaNOTE: was true
    return LeoAltholic.globalData.settings.checklist.displayName
end
function LeoAltholicChecklistUI.SetHideWhenToolbar(value)
    LeoAltholic.globalData.settings.checklist.hideWhenToolbar = value
    LeoAltholicChecklistUI.update()
end
function LeoAltholicChecklistUI.IsHideWhenToolbar()
    if LeoAltholic.globalData.settings.checklist.hideWhenToolbar == nil then LeoAltholic.globalData.settings.checklist.hideWhenToolbar = true end    --TevaNOTE: was false
    return LeoAltholic.globalData.settings.checklist.hideWhenToolbar
end

function LeoAltholicChecklistUI.SetUpwards(value)
    LeoAltholic.globalData.settings.checklist.upwards = value
    LeoAltholicChecklistUI.update()
end
function LeoAltholicChecklistUI.IsUpwards()
    return LeoAltholic.globalData.settings.checklist.upwards or false
end

function LeoAltholicChecklistUI.SetEnabled(value)
    LeoAltholic.charData.settings.checklist.enabled = value
    LeoAltholicChecklistUI.RestorePosition()
end
function LeoAltholicChecklistUI.IsEnabled()
    if LeoAltholic.charData.settings.checklist.enabled == nil then LeoAltholic.charData.settings.checklist.enabled = true end
    return LeoAltholic.charData.settings.checklist.enabled
end

function LeoAltholicChecklistUI.SetCraft(craft, value)
    if not LeoAltholic.charData.settings.checklist.craft then LeoAltholic.charData.settings.checklist.craft = {} end
    LeoAltholic.charData.settings.checklist.craft[craft] = value
    LeoAltholicChecklistUI.update()
end
function LeoAltholicChecklistUI.GetCraft(craft)
    if not LeoAltholic.charData.settings.checklist.craft then LeoAltholic.charData.settings.checklist.craft = {} end
    return LeoAltholic.charData.settings.checklist.craft[craft]
end
function LeoAltholicChecklistUI.SetRiding(value)
    LeoAltholic.charData.settings.checklist.riding = value
    LeoAltholicChecklistUI.update()
end
function LeoAltholicChecklistUI.GetRiding()
    if LeoAltholic.charData.settings.checklist.riding == nil then LeoAltholic.charData.settings.checklist.riding = true end
    local char = LeoAltholic.GetMyself()
    return LeoAltholic.charData.settings.checklist.riding and
        (char.attributes.riding.speed < char.attributes.riding.speedMax or
        char.attributes.riding.stamina < char.attributes.riding.staminaMax or
        char.attributes.riding.capacity < char.attributes.riding.capacityMax)
end

function LeoAltholicChecklistUI.OnWindowMoveStop()
    LeoAltholicChecklistUI.SetPosition(LeoAltholicChecklist:GetLeft(), LeoAltholicChecklist:GetTop())
end

function LeoAltholicChecklistUI.ToggleUI()
    if not LeoAltholicChecklistUI.IsEnabled() then return end
    LeoAltholicChecklist:SetHidden(not LeoAltholicChecklist:IsHidden())
end

function LeoAltholicChecklistUI.ShowUI()
    if not LeoAltholicChecklistUI.IsEnabled() then return end
    LeoAltholicChecklist:SetHidden(false)
end

function LeoAltholicChecklistUI.CheckHide()
    if not LeoAltholicChecklistUI.IsEnabled() or LeoAltholicChecklistUI.IsHideWhenToolbar() then
        LeoAltholicChecklist:SetHidden(true)
        return
    end

    if LeoAltholicChecklistUI.checkAllDone() then
        LeoAltholicChecklist:SetHidden(true)
        return
    end

    LeoAltholicChecklist:SetHidden(false)
    LeoAltholicChecklistUI.MaximizeUI()
end

function LeoAltholicChecklistUI.RestorePosition()
    local position = LeoAltholicChecklistUI.GetPosition()
    local left = position.left
    local top = position.top
    LeoAltholicChecklist:ClearAnchors()
    LeoAltholicChecklist:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, left, top)
    LeoAltholicChecklistUI:CheckHide()
end

local SPACE = 34
local checklist = WINDOW_MANAGER:GetControlByName("LeoAltholicChecklist")
local panel = GetControl(checklist, "Panel")
local height = 0
local checklistHeight = 0
local checklistSavedTop = 0
local lastChecklist = GetTimeStamp()

function LeoAltholicChecklistUI.MinimizeUI()
    if not LeoAltholicChecklistUI.IsEnabled() then return end
    checklistSavedTop = checklist:GetTop()
    local header = GetControl(checklist, "BGHeader")
    local headerHeight = header:GetHeight()
    local headerTop = header:GetTop()
    local headerBottom = header:GetBottom()

    panel:SetHidden(true)
    LeoAltholicChecklistMinButton:SetHidden(true)
    LeoAltholicChecklistMaxButton:SetHidden(false)

    checklist:SetHeight(headerHeight)
--    checklist:ClearAnchors()

    if LeoAltholicChecklistUI.IsUpwards() then
        checklist:SetAnchor(BOTTOMLEFT, GuiRoot, TOPLEFT, checklist:GetLeft(), headerBottom)
    else
        checklist:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, checklist:GetLeft(), headerTop)
    end

    LeoAltholicChecklistUI.SetMinimized(true)
end

function LeoAltholicChecklistUI.MaximizeUI()
    if not LeoAltholicChecklistUI.IsEnabled() then return end
    panel:SetHidden(false)
    LeoAltholicChecklistMinButton:SetHidden(false)
    LeoAltholicChecklistMaxButton:SetHidden(true)

--    checklist:ClearAnchors()
--    checklist:SetAnchor(TOPLEFT, GuiRoot, TOPLEFT, checklist:GetLeft(), checklistSavedTop)
    checklist:SetHeight(checklistHeight)

    LeoAltholicChecklistUI.SetMinimized(false)
end

local function createItem(label, labelText, texture, craftIcon, canShow)
    if canShow == true then
--Teva changed lines below
        texture:SetTexture("esoui/art/buttons/decline_up.dds")
        texture.tooltip = "Never Done or Needs /reloadUI"
--        texture:SetColor(1,0,0,1) --red
--Teva changed lines above
        texture:SetDimensions(32, 32)
        texture:SetAnchor(TOPLEFT, panel, TOPLEFT, 10, height)
        local scaledSpace = SPACE * (LeoAltholicChecklistUI.GetFontScale() / 100)
        height = height + scaledSpace
        if LeoAltholicChecklistUI.DisplayName() then
            label:SetText(labelText)
            label:SetHidden(false)
            craftIcon:SetHidden(true)
        else
            craftIcon:SetHidden(false)
            label:SetHidden(true)
        end
        texture:SetHidden(false)
    else
        label:SetHidden(true)
        texture:SetHidden(true)
        craftIcon:SetHidden(true)
    end
end

function LeoAltholicChecklistUI.checkReset()
    if LeoAltholic.IsBeforeReset(lastChecklist) then
        LeoAltholicChecklistUI.update()
        lastChecklist = GetTimeStamp()
    end
end

local function doneItem(label, texture)    --Teva changed these settings
    texture:SetTexture("esoui/art/cadwell/checkboxicon_checked.dds")    --("esoui/art/buttons/checkbox_checked.dds") --("esoui/art/loot/loot_finesseItem.dds")
    texture:SetColor(0.7,0.7,0.7,1) --now gray instead of green(0,1,0,1)
    texture.tooltip = "Done for Today"    --TevaNOTE: consider labeling as "Delivered, /reloadUI to check if new writ may be available" after was GetString(SI_ACHIEVEMENTS_TOOLTIP_COMPLETE)
end

local function writdoneItem(label, texture)    --Teva added this function
    texture:SetTexture("esoui/art/buttons/checkbox_checked.dds")        --("esoui/art/cadwell/checkboxicon_checked.dds")    --("esoui/art/cadwell/checkboxicon_unchecked.dds") --("esoui/art/buttons/decline_up.dds")
    texture:SetColor(1,1,1,1)            --TevaNOTE: was (1,0,0,1) --red
    texture.tooltip = "Quest Completed, /reloadUI or look to toolbar to see if Today's Writ may be available"
end                --Teva added this function

local function betweenItem(label, texture)    --Teva added this function
    texture:SetTexture("esoui/art/cadwell/checkboxicon_unchecked.dds") --("esoui/art/buttons/decline_up.dds")
    texture:SetColor(1,0,0,1) --red
    texture.tooltip = "Need Today's Writ"
end    --eof added by Teva

local function startItem(label, texture)    --Teva changed these settings
    texture:SetTexture("esoui/art/buttons/pointsminus_up.dds")
    texture:SetColor(1,0.5,0,1) --now orange instead of white(1,1,1,1)
    texture.tooltip = "Have Quest, No Progress"
end

local function updateItem(label, texture)    --Teva changed these settings
    texture:SetTexture("esoui/art/buttons/pointsplus_up.dds")
    texture:SetColor(1,1,0,1) --now yellow instead of darkyellow(1,0.9,0,1)
    texture.tooltip = "Partially Complete"
end

local function preDeliverItem(label, texture)    --Teva changed these settings
    texture:SetTexture("esoui/art/loot/loot_finesseItem.dds") --("esoui/art/buttons/decline_up.dds" or "esoui/art/loot/loot_finesseItem.dds")
    texture:SetColor(0,1,0,1) --now green instead of yellow(1,1,0,1)
    texture.tooltip = "Ready for Delivery"
end

local function stoppedItem(label, texture)    --Teva changed these settings
    texture:SetTexture("esoui/art/buttons/decline_up.dds")
    texture:SetColor(1,0,0,1) --red
    texture.tooltip = "Quest Abandoned"
end

function LeoAltholicChecklistUI.checkAllDone()
    local char = LeoAltholic.GetMyself()

    for _, craft in pairs(LeoAltholic.allCrafts) do
        if LeoAltholicChecklistUI.GetCraft(craft) then
            for _, writ in pairs(char.quests.writs) do
                if craft == writ.craft then
--                    if writ.lastDone == nil or not LeoAltholic.IsAfterReset(writ.lastDone) then return false end
--next section modified by Teva to add more conditions
                    if writ.lastDone == nil or writ.lastStarted == nil then
                        return false
                    elseif LeoAltholic.IsBeforeReset(writ.lastStarted) then
                        return false
                    elseif LeoAltholic.IsBeforeReset(writ.lastDone) then
                        return false
                    elseif writ.lastDone < writ.lastStarted then
                        return false
                    end
--end Teva's mods
                end
            end
        end
    end
    if LeoAltholicChecklistUI.GetRiding() and char.attributes.riding.time - GetTimeStamp() < 0 then
        return false
    end

    return true
end

function LeoAltholicChecklistUI.doneWrit(craft)
    lastUpdated = nil
    lastPreDeliver = nil
--TevaNOTE: above lines added by Teva
    if not LeoAltholicChecklistUI.IsEnabled() then return end
    local label = GetControl(panel, "Craft"..craft)
    local texture = GetControl(panel, "Craft"..craft.."Status")
    writdoneItem(label, texture)        --TevaNOTE: was doneItem but was always saying that instead of between, so modified to at least warn it might be wrong
    LeoAltholicChecklistUI.update()    --TevaNOTE: this line may be the key to solving the between/done issue in the checklist!
end

function LeoAltholicChecklistUI.betweenWrit(craft) --Teva added this function
    lastUpdated = nil
    lastPreDeliver = nil
    if not LeoAltholicChecklistUI.IsEnabled() then return end
    local label = GetControl(panel, "Craft"..craft)
    local texture = GetControl(panel, "Craft"..craft.."Status")
    betweenItem(label, texture)
end

function LeoAltholicChecklistUI.startedWrit(craft)
    if not LeoAltholicChecklistUI.IsEnabled() then return end
    local label = GetControl(panel, "Craft"..craft)
    local texture = GetControl(panel, "Craft"..craft.."Status")
    startItem(label, texture)
end

function LeoAltholicChecklistUI.updateWrit(craft)
    if not LeoAltholicChecklistUI.IsEnabled() then return end
    local label = GetControl(panel, "Craft"..craft)
    local texture = GetControl(panel, "Craft"..craft.."Status")
    updateItem(label, texture)
end

function LeoAltholicChecklistUI.preDeliverWrit(craft)
    if not LeoAltholicChecklistUI.IsEnabled() then return end
    local label = GetControl(panel, "Craft"..craft)
    local texture = GetControl(panel, "Craft"..craft.."Status")
    preDeliverItem(label, texture)
end

function LeoAltholicChecklistUI.stoppedWrit(craft)
    lastStarted = nil
    lastUpdated = nil
    lastPreDeliver = nil
--TevaNOTE: above lines added by Teva
    if not LeoAltholicChecklistUI.IsEnabled() then return end
    local label = GetControl(panel, "Craft"..craft)
    local texture = GetControl(panel, "Craft"..craft.."Status")
    stoppedItem(label, texture)
end

function LeoAltholicChecklistUI.doneRiding()
    if not LeoAltholicChecklistUI.IsEnabled() then return end
    local label = GetControl(panel, "Riding")
    local texture = GetControl(panel, "RidingStatus")
    doneItem(label, texture)
    LeoAltholicChecklistUI.update()
end

function LeoAltholicChecklistUI.initializeQuests()
    for i,trackedQuest in pairs(LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs) do
        for questIndex = 1, MAX_JOURNAL_QUESTS do
            if IsValidQuestIndex(questIndex) and GetJournalQuestName(questIndex) == trackedQuest.name then
                if LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].lastStarted == nil then
                    LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].questIndex = questIndex
                    LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].lastPreDeliver = nil
                    LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].lastUpdated = nil
                    LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].lastStarted = GetTimeStamp()    --TevaNOTE: had this commented out earlier, consider again if between becomes broken
--TevaNOTE: nest these above lines in an if or move the line above that is commented out here to where it only happens at the start of the quest, this function is called in initialize() onAddonLoaded
                end
                LeoAltholicChecklistUI.startedWrit(trackedQuest.craft)

                local hasUpdated = false
                local numConditions = GetJournalQuestNumConditions(questIndex, QUEST_MAIN_STEP_INDEX)
                for condition = 1, numConditions do
                    local current, max =  GetJournalQuestConditionValues(questIndex, QUEST_MAIN_STEP_INDEX, condition)
                    if hasUpdated == false and current > 0 then hasUpdated = true end
                    local condText = GetJournalQuestConditionInfo(questIndex, QUEST_MAIN_STEP_INDEX, condition)
                    if string.find(condText, GetString(LEOALT_DELIVER)) then
                        LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].lastPreDeliver = GetTimeStamp()
                        LeoAltholicChecklistUI.preDeliverWrit(trackedQuest.craft)
                        break
                    end
                end
                if hasUpdated then
                    LeoAltholic.globalData.CharList[LeoAltholic.CharName].quests.writs[i].lastUpdated = GetTimeStamp()
                    LeoAltholicChecklistUI.updateWrit(trackedQuest.craft)
                end
                break
            end
        end
        -- if not isDone then LeoAltholicChecklistUI.MaximizeUI() end        --Teva added this function here
    end
end

function LeoAltholicChecklistUI.update()
    if not LeoAltholicChecklistUI.IsEnabled() then return end
    local char = LeoAltholic.GetMyself()
    local texture, label, craftIcon
    height = 0
    local scale = LeoAltholicChecklistUI.GetFontScale() / 100
    for _, craft in pairs(LeoAltholic.allCrafts) do
        label = GetControl(panel, "Craft"..craft)
        craftIcon = GetControl(panel, "Craft"..craft.."Icon")
        texture = GetControl(panel, "Craft"..craft.."Status")
        local isDone = false
        local isBetween = false
        local isPreDeliver = false
        local isUpdated = false
        local isStarted = false
        for _, writ in pairs(char.quests.writs) do
            if craft == writ.craft then
                if writ.lastStarted ~= nil then
                    if writ.lastDone ~= nil and writ.lastDone > writ.lastStarted then
                        if LeoAltholic.IsBeforeReset(writ.lastStarted) then    --
                            isBetween = true            --Status: Need Today's Writ, completed old writ
                        --    icon:SetColor(1,0,0,1)        --red
                        elseif LeoAltholic.IsAfterReset(writ.lastStarted) then        --
                            isDone = true                --Status: Done for Today    --
                        --    icon:SetColor(1,1,1,1)        --Teva added this line to make icons white when complete
                        end                                                            --
                    elseif writ.lastPreDeliver ~= nil then
                        isPreDeliver = true            --Status: Ready to Deliver
                    --    icon:SetColor(0,1,0,1)        --now green, was yellow(1,1,0,1)
                    elseif writ.lastUpdated ~= nil then
                        isUpdated = true
                    --    icon:SetColor(1,1,0,1)        --now yellow, was darkyellow(1,0.8,0,1)
                    else    --if writ.lastStarted ~= nil then
                        isStarted = true            --Status: Quest Acquired, No Progress
                    --    icon:SetColor(1,0.5,0,1)    --now orange,was???(0.8,0.8,0.8,1)
                    end
                else    --if writ.lastStarted == nil then
                    texture:SetTexture("esoui/art/cadwell/checkboxicon_unchecked.dds")
                    texture:SetColor(1,0,0,1) --red
                    texture.tooltip = "Not Started While this Addon was active"
                end
            end
        end
        local canShow = LeoAltholicChecklistUI.GetCraft(craft)
        createItem(label, ZO_CachedStrFormat(SI_ABILITY_NAME, ZO_GetCraftingSkillName(craft)), texture, craftIcon, canShow)
        if canShow == true then
            if isDone then
                doneItem(label, texture)
            elseif isBetween then    --Teva added the isBetween condition and effects
                betweenItem(label, texture)
            elseif isPreDeliver then
                preDeliverItem(label, texture)
            elseif isUpdated then
                updateItem(label, texture)
            elseif isStarted then
                startItem(label, texture)
            else
                texture:SetTexture("esoui/art/buttons/decline_up.dds")
                texture.tooltip = "Never Done or Needs Reload UI"
                --texture:SetColor(1,0,0,1) --red
            end
        end
    end

    label = GetControl(panel, "Riding")
    label:SetColor(1,1,1,1)
    texture = GetControl(panel, "RidingStatus")
    craftIcon = GetControl(panel, "RidingIcon")
    createItem(label, GetString(SI_STAT_GAMEPAD_RIDING_HEADER_TRAINING), texture, craftIcon, LeoAltholicChecklistUI.GetRiding())
    if char.attributes.riding.time > 0 and char.attributes.riding.time - GetTimeStamp() > 0 then
        doneItem(label, texture)
    else
        betweenItem(label, texture)
    end
    checklistHeight = height + 2*(100 - LeoAltholicChecklistUI.GetFontScale())
    checklist:SetHeight(checklistHeight)
    panel:SetHeight(checklistHeight)
    panel:ClearAnchors()
    local header = GetControl(checklist, "BGHeader")
    header:ClearAnchors()
    if LeoAltholicChecklistUI.IsUpwards() then
        header:SetAnchor(BOTTOMLEFT, checklist, BOTTOMLEFT, 0, 0)
        panel:SetAnchor(BOTTOMLEFT, header, TOPLEFT, 0, 2)
    else
        header:SetAnchor(TOPLEFT, checklist, TOPLEFT, 0, 0)
        panel:SetAnchor(TOPLEFT, header, BOTTOMLEFT, 0, 2)
    end

    local width = 200
    if not LeoAltholicChecklistUI.DisplayName() then
        width = 120
    end
    checklist:SetWidth(width)
    panel:SetWidth(width)
    header:SetWidth(width)
    checklist:SetScale(scale)

    LeoAltholicChecklistUI:CheckHide()
end