angular.module('NgSwipe', [])

.factory 'SwipeStart', ->
  object = {}

  object.set = (x,y) ->
    this.x = x
    this.y = y

  object.get = ->
      return this

  return object
.directive 'ngSwipeUp', ->
  controller: ($scope, $element, SwipeStart) ->
    callFunction = $element[0].attributes['ng-swipe-up'].value
    if callFunction.indexOf('=') > -1
      split = callFunction.split('=')
      callFunction = []
      for arg in split
        unless arg.indexOf('true') > -1 || arg.indexOf('false') > -1
          callFunction.push('!$scope.' + arg.replace(/!/g,'').trim()) if arg.indexOf('!') > -1
          callFunction.push('$scope.' + arg) if arg.indexOf('!') < 0
        else
          callFunction.push('!' + arg.replace(/!/g,'').trim()) if arg.indexOf('!') > -1
          callFunction.push(arg) if arg.indexOf('!') < 0
      callFunction = callFunction.join(' = ')
    else
      callFunction = '$scope.' + callFunction.trim()
    $element.bind 'touchstart', (event) ->
      touchStart = event.originalEvent.targetTouches[0]
      SwipeStart.set(touchStart.screenX, touchStart.screenY)
    $element.bind 'touchend', (event) ->
      touchEnd = event.originalEvent.changedTouches[0]
      if (Math.abs(SwipeStart.get().x - touchEnd.screenX) < Math.abs(SwipeStart.get().y - touchEnd.screenY)) && (SwipeStart.get().y - touchEnd.screenY > 0)
        $scope.$apply ->
          eval callFunction
.directive 'ngSwipeDown', ->
  controller: ($scope, $element, SwipeStart) ->
    callFunction = $element[0].attributes['ng-swipe-down'].value
    if callFunction.indexOf('=') > -1
      split = callFunction.split('=')
      callFunction = []
      for arg in split
        unless arg.indexOf('true') > -1 || arg.indexOf('false') > -1
          callFunction.push('!$scope.' + arg.replace(/!/g,'').trim()) if arg.indexOf('!') > -1
          callFunction.push('$scope.' + arg) if arg.indexOf('!') < 0
        else
          callFunction.push('!' + arg.replace(/!/g,'').trim()) if arg.indexOf('!') > -1
          callFunction.push(arg) if arg.indexOf('!') < 0
      callFunction = callFunction.join(' = ')
    else
      callFunction = '$scope.' + callFunction.trim()
    $element.bind 'touchstart', (event) ->
      touchStart = event.originalEvent.targetTouches[0]
      SwipeStart.set(touchStart.screenX, touchStart.screenY)
    $element.bind 'touchend', (event) ->
      touchEnd = event.originalEvent.changedTouches[0]
      if (Math.abs(SwipeStart.get().x - touchEnd.screenX) < Math.abs(SwipeStart.get().y - touchEnd.screenY)) && (SwipeStart.get().y - touchEnd.screenY < 0)
        $scope.$apply ->
          eval callFunction