Xmpp.Views.Contacts ||= {}

class Xmpp.Views.Contacts.MeView extends Backbone.View
  template: JST["backbone/templates/contacts/me"]
  el: $('#js-me')

  events:
    'click .js-edit-status': (e) -> @editTextInput(e)
    'keypress .js-edit-status': (e) -> @confirmMyStatus(e)

    'click .js-edit-name': (e) -> @editTextInput(e)
    'keypress .js-edit-name': (e) -> @confirmMyName(e)

    'click .js-change-state': (e) -> @openChangeState(e)
    'click .js-state-clickable': (e) -> @confirmChangeState(e)

    #avatar change events:
    'mouseover .avatar': 'mouseoverAvatar'
    'mouseout .avatar': 'mouseoutAvatar'
    'click .change-avatar': -> $('input[name=avatar]').click()
    'change input[name=avatar]': 'uploadAvatar'

  initialize: () ->
    _.bindAll(this)

    @model.on('change', @updateContact, this)

  updateContact: (me) ->
    @model = me
    @render()

  render: ->
    contact = @model.toJSON()
    $(@el).html(@template(contact))
    this

  editTextInput: (e) ->
    return false if App.Models.me.get('isFB')
    $this = $(e.currentTarget)

    if ($this.hasClass('empty'))
      $this.val('')

    if (! $this.hasClass('editing'))
      $this.removeClass('empty')
           .addClass('editing')

  confirmMyStatus: (e) ->
    if (e.which != 13 && e.which != 10)
      return

    $this = $(e.currentTarget)

    if ($this.val() == '')
      $this.removeClass('editing')
        .addClass('empty')
        .val(I18n.t('chat.roster.change_status_msg'))
    else
      $this.removeClass('editing')

    $this.blur()
    App.Com.updateMyStatus(@_getStatusMessage(), @_getState())

  confirmMyName: (e) ->
    if (e.which != 13 && e.which != 10)
      return

    $this = $(e.currentTarget)

    if ($this.val() == '')
      $this.removeClass('editing')
        .val(@model.get('jid'))
    else
      $this.removeClass('editing')

    $this.blur()
    App.Com.updateMyVcardName(@_getName())
    @model.set('name', @_getName())

  openChangeState: (e) ->
    $this = $(e.currentTarget)

    $this.addClass('editing')
         .find('.hidden').removeClass('hidden')

    $('.rolldown').removeClass('js-change-state')
                  .find('.drop-down').addClass('hidden')

  confirmChangeState: (e) ->
    $this = $(e.currentTarget)

    $('.rolldown').removeClass('editing')
      .addClass('js-change-state')
      .children().addClass('hidden')

    $('.rolldown').find('a').removeClass('active')
                  .find('.drop-down').removeClass('hidden')

    $this.removeClass('hidden')
      .find('a').addClass('active')

    App.Com.updateMyStatus(@_getStatusMessage(), @_getState())

  mouseoverAvatar: ->
    return false if App.Models.me.get('isFB')
    $('.change-avatar').show()

  mouseoutAvatar: ->
    return false if App.Models.me.get('isFB')
    $('.change-avatar').hide()

  uploadAvatar: (e) ->
    return false if App.Models.me.get('isFB')

    fr = new FileReader;
    fr.onloadend = ->
      App.Models.me.set(avatar: fr.result)
      App.Com.updateMyVcardAvatar(fr.result)

    fr.readAsDataURL(e.target.files[0]);

  _getStatusMessage: ->
    if $('.js-edit-status').hasClass('empty')
      return ''
    else
      $('.js-edit-status').val()

  _getState: ->
    $('.js-state-clickable:not(.hidden)').data('state')

  _getName: ->
    $('.js-edit-name').val()