angular.module('EssayApp.directives').directive("checkError", ['$timeout', ($timeout) -> restrict: 'A' scope: true link: (scope, element, attrs) -> ngForm = scope.$eval(attrs.checkError) object = attrs.checkErrorObject || "customer" submitted = () -> ngForm.$submitted scrollToError = () -> input = element.find('.ng-invalid:not(form):not([ng-form]):eq(0)') if input.length > 0 unless attrs.notScrollOnError || input.data('notScrollOnError') $('html, body').animate( scrollTop: input.offset().top - 250 , 500, -> input.trigger('focusout') input.focus().select() ) else $timeout (-> input.trigger('focusout') input.focus().select() ), 0, false checkForm = (form) -> if form.$invalid for own key, value of form.$error $.each value, (index, model) -> model.$setTouched?(true) $timeout(scrollToError, 0, false) form.$submitted = false if form?.$submitted applyErrors = (form, errors) -> err = undefined for own key, value of errors _message = if angular.isArray(value) then value[0] else value _input = ngForm["#{object}[#{key}]"] if _input? _input.$setDirty() err ||= el = $("[name='#{object}[#{key}]']").first() if el.length > 0 switch _message when 'is invalid' _message = el.data('errorInvalid') || _message when 'has already been taken' _message = el.data('errorTaken') || _message if el.data('errorServerOverrideable') || !el.data('errorServer')? el.data('errorServer', _message) el.data('errorServerOverrideable', true) _input.$setValidity('server', false) if err form.$submitted = false if form?.$submitted $timeout(scrollToError, 100, false) scope.$watch submitted, (called) -> if called checkForm(ngForm) scope.$watch (attrs.remoteErrorObject || 'errors'), (errors) -> if errors applyErrors(ngForm, errors) ])