components_extras_ExtrasRowList.bs

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

sub init()
  m.top.visible = true
  updateSize()
  m.top.observeField("rowItemSelected", "onRowItemSelected")
  m.top.observeField("rowItemFocused", "onRowItemFocused")

  ' Set up all Tasks
  m.LoadPeopleTask = CreateObject("roSGNode", "LoadItemsTask")
  m.LoadPeopleTask.itemsToLoad = "people"
  m.LoadPeopleTask.observeField("content", "onPeopleLoaded")
  m.LikeThisTask = CreateObject("roSGNode", "LoadItemsTask")
  m.LikeThisTask.itemsToLoad = "likethis"
  m.LikeThisTask.observeField("content", "onLikeThisLoaded")
  m.SpecialFeaturesTask = CreateObject("roSGNode", "LoadItemsTask")
  m.SpecialFeaturesTask.itemsToLoad = "specialfeatures"
  m.SpecialFeaturesTask.observeField("content", "onSpecialFeaturesLoaded")
  m.LoadAdditionalPartsTask = CreateObject("roSGNode", "LoadItemsTask")
  m.LoadAdditionalPartsTask.itemsToLoad = "additionalparts"
  m.LoadAdditionalPartsTask.observeField("content", "onAdditionalPartsLoaded")
  m.LoadMoviesTask = CreateObject("roSGNode", "LoadItemsTask")
  m.LoadMoviesTask.itemsToLoad = "personMovies"
  m.LoadShowsTask = CreateObject("roSGNode", "LoadItemsTask")
  m.LoadShowsTask.itemsToLoad = "personTVShows"
  m.LoadSeriesTask = CreateObject("roSGNode", "LoadItemsTask")
  m.LoadSeriesTask.itemsToLoad = "personSeries"
end sub

sub updateSize()
  itemHeight = 396
  m.top.itemSize = [1920, itemHeight]
  m.top.rowItemSpacing = [36, 36]

  ' override defaults from JRRowList
  m.top.vertFocusAnimationStyle = "fixedFocus"
end sub

sub loadParts(data as object)
  m.top.parentId = data.id
  m.people = data.People
  m.LoadAdditionalPartsTask.itemId = m.top.parentId
  m.LoadAdditionalPartsTask.control = "RUN"
end sub

sub loadPersonVideos(personId)
  m.personId = personId
  m.LoadMoviesTask.itemId = m.personId
  m.LoadMoviesTask.observeField("content", "onMoviesLoaded")
  m.LoadMoviesTask.control = "RUN"
end sub

sub onAdditionalPartsLoaded()
  parts = m.LoadAdditionalPartsTask.content
  m.LoadAdditionalPartsTask.unobserveField("content")

  data = CreateObject("roSGNode", "ContentNode") ' The row Node
  m.top.content = data
  if parts <> invalid and parts.count() > 0
    row = buildRow(tr("Additional Parts"), parts, 464)
    addRowSize([464, 291])
    m.top.content.appendChild(row)
    m.top.rowItemSize = [[464, 291]]
  else
    m.top.rowItemSize = [[234, 396]]
  end if

  ' Load Cast and Crew and everything else...
  m.LoadPeopleTask.peopleList = m.people
  m.LoadPeopleTask.control = "RUN"
end sub

sub onPeopleLoaded()
  people = m.LoadPeopleTask.content
  m.loadPeopleTask.unobserveField("content")
  if people <> invalid and people.count() > 0
    row = m.top.content.createChild("ContentNode")
    row.Title = tr("Cast & Crew")
    for each person in people
      if person.json.type = "Actor" and person.json.Role <> invalid and person.json.Role.ToStr().Trim() <> ""
        person.subTitle = "as " + person.json.Role
      else
        person.subTitle = person.json.Type
      end if
      person.Type = "Person"
      row.appendChild(person)
    end for
  end if
  m.LikeThisTask.itemId = m.top.parentId
  m.LikeThisTask.control = "RUN"
end sub

sub onLikeThisLoaded()
  data = m.LikeThisTask.content
  m.LikeThisTask.unobserveField("content")
  if data <> invalid and data.count() > 0
    row = m.top.content.createChild("ContentNode")
    row.Title = tr("More Like This")
    for each item in data
      item.Id = item.json.Id
      item.labelText = item.json.Name
      if item.json.ProductionYear <> invalid
        item.subTitle = stri(item.json.ProductionYear)
      else if item.json.PremiereDate <> invalid
        premierYear = CreateObject("roDateTime")
        premierYear.FromISO8601String(item.json.PremiereDate)
        item.subTitle = stri(premierYear.GetYear())
      end if
      item.Type = item.json.Type
      row.appendChild(item)
    end for
    addRowSize([234, 396])
  end if
  ' Special Features next...
  m.SpecialFeaturesTask.itemId = m.top.parentId
  m.SpecialFeaturesTask.control = "RUN"
end sub

function onSpecialFeaturesLoaded()
  data = m.SpecialFeaturesTask.content
  m.SpecialFeaturesTask.unobserveField("content")
  if data <> invalid and data.count() > 0
    row = m.top.content.createChild("ContentNode")
    row.Title = tr("Special Features")
    for each item in data
      m.top.visible = true
      item.Id = item.json.Id
      item.labelText = item.json.Name
      item.subTitle = ""
      item.Type = item.json.Type
      item.imageWidth = 450
      row.appendChild(item)
    end for
    addRowSize([462, 372])
  end if

  return m.top.content
end function

sub onMoviesLoaded()
  data = m.LoadMoviesTask.content
  m.LoadMoviesTask.unobserveField("content")
  rlContent = CreateObject("roSGNode", "ContentNode")
  if data <> invalid and data.count() > 0
    row = rlContent.createChild("ContentNode")
    row.title = tr("Movies")
    for each mov in data
      mov.Id = mov.json.Id
      mov.labelText = mov.json.Name
      mov.subTitle = mov.json.ProductionYear
      mov.Type = mov.json.Type
      row.appendChild(mov)
    end for
    m.top.rowItemSize = [[234, 396]]
  end if
  m.top.content = rlContent
  m.LoadShowsTask.itemId = m.personId
  m.LoadShowsTask.observeField("content", "onShowsLoaded")
  m.LoadShowsTask.control = "RUN"
end sub

sub onShowsLoaded()
  data = m.LoadShowsTask.content
  m.LoadShowsTask.unobserveField("content")
  if data <> invalid and data.count() > 0
    row = buildRow("TV Shows", data, 502)
    addRowSize([502, 396])
    m.top.content.appendChild(row)
  end if
  m.LoadSeriesTask.itemId = m.personId
  m.LoadSeriesTask.observeField("content", "onSeriesLoaded")
  m.LoadSeriesTask.control = "RUN"
end sub

sub onSeriesLoaded()
  data = m.LoadSeriesTask.content
  m.LoadSeriesTask.unobserveField("content")
  if data <> invalid and data.count() > 0
    row = buildRow("Series", data)
    addRowSize([234, 396])
    m.top.content.appendChild(row)
  end if
  m.top.visible = true
end sub

function buildRow(rowTitle as string, items, imgWdth = 0)
  row = CreateObject("roSGNode", "ContentNode")
  row.Title = tr(rowTitle)
  for each mov in items
    if LCase(mov.json.type) = "episode"
      if isAllValid([mov.json.SeriesName, mov.json.ParentIndexNumber, mov.json.IndexNumber, mov.json.Name])
        mov.labelText = mov.json.SeriesName
        mov.subTitle = `S${mov.json.ParentIndexNumber}:E${mov.json.IndexNumber} - ${mov.json.Name}`
      else
        mov.labelText = mov.json.Name
        mov.subTitle = mov.json.ProductionYear
      end if
    else
      mov.labelText = mov.json.Name
      mov.subTitle = mov.json.ProductionYear
    end if

    mov.Id = mov.json.Id
    mov.Type = mov.json.Type
    if imgWdth > 0
      mov.imageWidth = imgWdth
    end if
    row.appendChild(mov)
  end for
  return row
end function

sub addRowSize(newRow)
  sizeArray = m.top.rowItemSize
  newSizeArray = []
  for each size in sizeArray
    newSizeArray.push(size)
  end for
  newSizeArray.push(newRow)
  m.top.rowItemSize = newSizeArray
end sub

sub onRowItemSelected()
  m.top.selectedItem = m.top.content.getChild(m.top.rowItemSelected[0]).getChild(m.top.rowItemSelected[1])
end sub

sub onRowItemFocused()
  m.top.focusedItem = m.top.content.getChild(m.top.rowItemFocused[0]).getChild(m.top.rowItemFocused[1])
end sub