angular.module('AComplete', [ 'FactoryName'])

.directive 'acList', ($parse,$filter)->
  restrict: 'A'
  require:  'ngModel'
  link: (scope, element, attributes, ngModelCtrl) ->
    scope.autoCompleteList = ->
      [item,list] = attributes.acList.split(' in ')
      actions = item.split('.')
      actions.shift()
      constructed = '.' + actions.join('.') if actions.length > 0
      constructed = '' unless actions.length > 0
      records = $filter('filter')($parse(list)(scope), (ngModelCtrl.$viewValue || '')) || []
      result = for record in records
        eval("record" + constructed)
      result || []
  controller: ($scope) ->
    @list = ->
      $scope.autoCompleteList()
    return
.directive 'aComplete', ->
  restrict: 'E'
  replace: true
  require:  ['ngModel','acList']
  template: (element, attributes) ->
    element.addClass('autocomplete')
    input = element[0].outerHTML.replace(/a-complete/g,'input')
    input = angular.element(input).attr('md-update','')
    "<md-input-container>" + input[0].outerHTML + "<div class='autocomplete menu md-whiteframe-z1'><a class='item' ng-click='select(item)' ng-repeat='item in list()'>{{item}}</a></div></md-input-container>"

  link: (scope,element,attributes,controllers) ->
    element.css('position','relative').css('display', 'block')
    scope.select = (item) ->
      controllers[0].$setViewValue(item)
      controllers[0].$render()
    scope.list = controllers[1].list
    menuNode = angular.element(element[0].getElementsByClassName('autocomplete menu'))
    inputNode = element.find('input')
    inputNode.css('padding-top','14px')
    inputNode.bind 'blur', ->
      active = angular.element(menuNode[0].getElementsByClassName('active')[0])
      active.removeClass('active')
      controllers[0].$setViewValue(inputNode.val())
      controllers[0].$render()
    inputNode.bind 'keydown', (input)->
      keypress = (direction) ->
        index = if direction == 'next' then 0 else menuNode.find('a').length - 1
        selected = angular.element(menuNode[0].getElementsByClassName('active')[0])
        if selected.hasClass('active')
          selected.removeClass('active')
          until complete
            selected = angular.element(selected[0][direction + 'Sibling']) if selected[0]
            complete = !!selected[0]
            complete = selected[0].tagName == 'A' if complete
            complete = true if !selected[0]
        selected = angular.element(menuNode.find('a')[index]) unless selected[0]
        ind = 0
        for el,i in menuNode[0].getElementsByTagName('a')
          ind = i if el == selected[0]
        scroll = selected[0].scrollHeight * ind
        selected[0].parentElement.scrollTop = scroll
        selected.addClass('active')
        inputNode.val(selected.text())
      if input.keyCode == 40
        keypress('next')
      if input.keyCode == 38
        keypress('previous')