Source: components/tvshows/TVEpisodeRowWithOptions.brs

import "pkg:/source/utils/misc.brs"

sub init()
    m.rows = m.top.findNode("tvEpisodeRow")
    m.tvListOptions = m.top.findNode("tvListOptions")

    m.rows.observeField("doneLoading", "rowsDoneLoading")
end sub

sub setupRows()
    objects = m.top.objects
    m.rows.objects = objects
end sub

sub rowsDoneLoading()
    m.top.doneLoading = true
end sub

' List of video versions to choose from
sub SetUpVideoOptions(streams as object)
    videos = []

    for i = 0 to streams.Count() - 1
        if LCase(streams[i].VideoType) = "videofile"
            ' Create options for user to switch between video tracks
            videos.push({
                "Title": streams[i].Name,
                "Description": tr("Video"),
                "Selected": m.top.objects.items[m.currentSelected].selectedVideoStreamId = streams[i].id,
                "StreamID": streams[i].id,
                "video_codec": streams[i].mediaStreams[0].displayTitle
            })
        end if
    end for

    if videos.count() >= 1
        options = {}
        options.videos = videos
        m.tvListOptions.options = options
    end if
end sub

' List of audio tracks to choose from
sub SetUpAudioOptions(streams as object)
    tracks = []

    for i = 0 to streams.Count() - 1
        if streams[i].Type = "Audio"
            tracks.push({
                "Title": streams[i].displayTitle,
                "Description": streams[i].Title,
                "Selected": m.top.objects.items[m.currentSelected].selectedAudioStreamIndex = i,
                "StreamIndex": i
            })
        end if
    end for

    if tracks.count() >= 1
        options = {}
        if isValid(m.tvListOptions.options) and isValid(m.tvListOptions.options.videos)
            options.videos = m.tvListOptions.options.videos
        end if
        options.audios = tracks
        m.tvListOptions.options = options
    end if
end sub

sub audioOptionsClosed()
    if m.currentSelected <> invalid
        ' If the user opened the audio options, we report back even if they left the selection alone.
        ' Otherwise, the users' lang peference from the server will take over.
        ' To do this, we interpret anything other than "0" as the user opened the audio options.
        m.top.objects.items[m.currentSelected].selectedAudioStreamIndex = m.tvListOptions.audioStreamIndex = 0 ? 1 : m.tvListOptions.audioStreamIndex
    end if
end sub

sub videoOptionsClosed()
    if m.tvListOptions.videoStreamId <> m.top.objects.items[m.currentSelected].selectedVideoStreamId
        m.rows.objects.items[m.currentSelected].selectedVideoStreamId = m.tvListOptions.videoStreamId
    end if
end sub

function onKeyEvent(key as string, press as boolean) as boolean
    if not press then return false

    if key = "options" and isValid(m.rows.focusedChild) and isValid(m.rows.focusedChild.rowItemFocused)
        m.currentSelected = m.rows.focusedChild.rowItemFocused[0]
        mediaStreams = m.rows.objects.items[m.currentSelected].json.MediaStreams
        mediaSources = m.rows.objects.items[m.currentSelected].json.MediaSources
        if m.rows.objects.items[m.currentSelected].selectedVideoStreamId <> ""
            for each source in mediaSources
                if source.id = m.rows.objects.items[m.currentSelected].selectedVideoStreamId
                    mediaStreams = source.MediaStreams
                    exit for
                end if
            end for
        end if
        if isValid(mediaSources)
            SetUpVideoOptions(mediaSources)
        end if
        if isValid(mediaStreams)
            SetUpAudioOptions(mediaStreams)
        end if
        if isValid(m.tvListOptions.options)
            m.tvListOptions.visible = true
            m.tvListOptions.setFocus(true)
        end if
        return true
    else if m.tvListOptions.visible = true and key = "back" or key = "options"
        m.tvListOptions.setFocus(false)
        m.tvListOptions.visible = false
        m.rows.setFocus(true)
        videoOptionsClosed()
        audioOptionsClosed()
        return true
    else if key = "up" and m.rows.hasFocus() = false
        m.rows.setFocus(true)
    else if key = "down" and m.rows.hasFocus() = false
        m.rows.setFocus(true)
    end if

    return false
end function