components_JROverhang.bs

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

sub init()
  m.top.id = "overhang"
  ' save node references
  m.logo = m.top.findNode("logo")
  m.logoPoster = createLogoPoster() ' save node to memory for faster load time
  m.title = m.top.findNode("title")
  m.user = m.top.findNode("username")
  m.userGroup = m.top.findNode("userGroup")
  m.clock = m.top.findNode("clock")

  ' Create animations programmatically to avoid interpolator field reference issues
  createSlideAnimations()
end sub

' Create slide animations programmatically
sub createSlideAnimations()
  ' Create slide up animation
  m.slideUpAnimation = createObject("roSGNode", "Animation")
  m.slideUpAnimation.id = "slideUp"
  m.slideUpAnimation.duration = 0.5
  m.slideUpAnimation.repeat = false

  slideUpInterpolator = createObject("roSGNode", "Vector2DFieldInterpolator")
  slideUpInterpolator.key = [0.0, 0.5]
  slideUpInterpolator.keyValue = [[0, 0], [0, -200]]
  slideUpInterpolator.fieldToInterp = m.top.id + ".translation"

  m.slideUpAnimation.appendChild(slideUpInterpolator)
  m.top.appendChild(m.slideUpAnimation)

  ' Create slide down animation
  m.slideDownAnimation = createObject("roSGNode", "Animation")
  m.slideDownAnimation.id = "slideDown"
  m.slideDownAnimation.duration = 0.5
  m.slideDownAnimation.delay = 0.2
  m.slideDownAnimation.repeat = false

  slideDownInterpolator = createObject("roSGNode", "Vector2DFieldInterpolator")
  slideDownInterpolator.key = [0.0, 0.5]
  slideDownInterpolator.keyValue = [[0, -200], [0, 0]]
  slideDownInterpolator.fieldToInterp = m.top.id + ".translation"

  m.slideDownAnimation.appendChild(slideDownInterpolator)
  m.top.appendChild(m.slideDownAnimation)
end sub

sub isVisibleChanged()
  if m.top.disableMoveAnimation
    m.top.translation = [0, 0]
    return
  end if
  if m.top.isVisible
    m.slideDownAnimation.control = "start"
    return
  end if

  m.slideUpAnimation.control = "start"
end sub

sub titleChanged()
  m.title.text = m.top.title
end sub

sub currentUserChanged()
  m.user.text = m.top.currentUser
  m.userImage = m.top.findNode("userImage")
  if not isValid(m.userPoster)
    m.userPoster = createUserPoster() ' save node to memory for faster load time
  end if

  if m.top.currentUser = ""
    ' no user logged in, remove image if it exists
    if isValid(m.userImage)
      m.userGroup.removeChild(m.userImage)
      m.userImage = invalid
    end if
  else if not isValid(m.userImage)
    ' user logged in but no image, add it
    m.userImage = m.userPoster
    if m.userImage.tag = ""
      m.userGroup.itemSpacings = 9 ' default image is padded
    else
      m.userGroup.itemSpacings = 15
    end if

    m.userGroup.insertChild(m.userImage, 0)
  end if
end sub

function createUserPoster() as object
  userImage = createObject("roSGNode", "Poster")

  imgParams = {
    maxHeight: 36,
    maxWidth: 36,
    quality: 90
  }
  imgTag = m.global.session.user.primaryImageTag
  if isValid(imgTag) and imgTag <> ""
    imgParams.tag = imgTag
    userImage.tag = imgTag
  end if

  userImage.id = "userImage"
  userImage.width = "36"
  userImage.height = "36"

  if isValid(imgTag)
    ' reset defaults
    userImage.blendColor = "0xFFFFFFFF"

    if m.global.session.server.url <> ""
      userImage.uri = buildURL(Substitute("/Users/{0}/Images/Primary", m.global.session.user.id), imgParams)
    else
      print "ERROR: No server URL set, cannot load user image"
    end if
  else
    userImage.blendColor = m.global.constants.colors.text_secondary
    userImage.uri = "pkg:/images/icons/person_36px.png"
  end if

  return userImage
end function

' component boolean field isVisible has changed value
sub isLogoVisibleChanged()
  if m.top.isLogoVisible
    if not isValid(m.logo)
      m.logo = m.logoPoster
      m.top.appendChild(m.logoPoster)

      m.title.translation = [420, 51]
      m.title.maxWidth = 300
    end if
  else
    ' remove the logo
    if isValid(m.logo)
      m.top.removeChild(m.logo)
      m.logo = invalid
      m.title.translation = [96, 51]
      m.title.maxWidth = 1560
    end if
  end if
end sub

' Create and return a logo poster node
function createLogoPoster()
  logoPoster = createObject("roSGNode", "Poster")
  logoPoster.id = "logo"
  logoPoster.uri = "pkg:/images/branding/logo.png"
  logoPoster.translation = "[96, 54]"
  logoPoster.width = "180"
  logoPoster.height = "39"

  return logoPoster
end function

sub resetTime()
  if isValid(m.clock)
    m.clock.callFunc("resetTime")
  end if
end sub