{"version":3,"sources":["/js\\controllers.js","/js\\directives.js","/js\\filters.js","/js\\helpers.js","/js\\libs\\easy.notification.js","/js\\libs\\jquery.isloading.js","/js\\libs\\jquery.mask.js","/js\\libs\\jquery.validationEngine-en.js","/js\\libs\\jquery.validationEngine.js","/js\\main.js","/js\\modal.js","/js\\services.js"],"names":["angular","module","controller","$scope","_","assign","window","user","filterPath","string","replace","scrollableElement","i","argLength","arguments","length","el","$scrollElement","$","scrollTop","isScrollable","locationPath","location","pathname","scrollElem","filter","each","thisPath","this","hostname","hash","target","$target","targetOffset","offset","top","click","e","preventDefault","animate","$location","$window","$http","userService","profile","secureForm","secureAccountField","secureExpDate","validateVgsHiddenCcInput","debounce","fakeInput","ccElem","val","validationEngine","validateVgsHiddenDateInput","dateElem","attachVgsFields","field","type","name","placeholder","autoComplete","validations","css","fontFamily","fontSize","&::placeholder","color","serializers","SERIALIZERS","separate","monthName","yearName","vgsConfigured","initProfile","vgsVaultId","VGSCollect","create","formState","Account","accountElem","accountState","isValid","isEmpty","toggleClass","isFocused","ExpirationDate","expDateElem","expDateState","today","Date","toDateString","$$phase","$apply","showVgs","showCreditCardInput","displayCreditCardField","showCancelButton","focusCreditCardInput","cancelChanges","getDatabagForFields","$fields","ajax","url","id","dataType","then","value","find","profileSendSuccessCallback","resp","primaryCard","additionalCards","submit","validate","send","reallyRemove","provider","providerName","actionid","removing","deauthProvider","keys","authProviders","confirm","timeout","method","success","data","isAuthenticated","error","authProvider","stopPropagation","popup","pop","left","width","height","screen","open","currentTarget","href","param","checkPopup","closed","path","setTimeout","fetchProviders","cache","size","deleteAccount","$profile","isLoading","text","position","loggedin","app","directive","version","scope","elm","$timeout","$parse","link","element","attrs","model","focusMe","$watch","focus","restrict","mask","fn","maxErrorsPerField","addClass","append","requiredIndicator","navHeight","bannerHeight","bannerTop","off","on","marginTop","String","Typekit","load","checkExpirationMonth","minMonth","getMonth","minYear","getFullYear","checkExpirationDate","enteredDate","minDate","isNaN","getTime","prototype","luhnCheck","luhnArr","sum","c","p","o","parseInt","s","g","r","a","m","q","push","l","createElement","getElementsByTagName","async","src","parentNode","insertBefore","document","ga","event","scroll","headerHeight","slice","jQuery","easyNotification","options","setCookie","days","date","setTime","expires","toGMTString","cookie","getCookie","nameEQ","ca","split","charAt","substring","indexOf","checkCookie","cookieExist","cookieEnable","cookieName","cookieValue","hide","obj","slideUp","cookieDays","callback","clearTimeout","show","remove","containerClassName","closeClassName","closeText","appendTo","sibling","before","fadeIn","insertAfter","prepend","prependTo","parent","autoClose","duration","defaults","delay","extend","Plugin","_defaults","_name","pluginName","_loader","init","contruct","opts","class","tpl","disableSource","disableOthers","is","attr","html","outerHeight","cssPosition","pos","outerWidth","after","removeAttr","removeClass","enableOthers","elt","Mask","old_value","jMask","byPassKeys","translation","0","pattern","9","optional","#","recursive","A","S","maxlength","destroyEvents","events","getMasked","behaviour","keydown","keyup","v","isInput","get","tagName","toLowerCase","inArray","keyCode","which","callbacks","lastMaskChar","check","buf","maskLen","valLen","addMethod","resetPos","reverse","maskDigit","valDigit","match","join","changed","onChange","onKeyPress","onComplete","getCleanVal","mLen","unmask","input","Zepto","validationEngineLanguage","newLang","allRules","required","regex","alertText","alertTextCheckboxMultiple","alertTextCheckboxe","alertTextDateRange","requiredInFunction","func","dateRange","alertText2","dateTimeRange","minSize","maxSize","groupRequired","min","max","past","future","maxCheckbox","minCheckbox","equals","creditCard","phone","email","integer","number","RegExp","exec","year","month","day","getDate","ipv4","onlyNumberSp","onlyLetterSp","onlyLetterNumber","ajaxUserCall","extraData","alertTextLoad","ajaxUserCallPhp","alertTextOk","ajaxNameCall","ajaxNameCallPhp","validate2fields","dateFormat","dateTimeFormat","alertText3","alertText4","require","methods","form","_saveOptions","fadeOut","attach","userOptions","validateAttribute","binded","validationEventTrigger","_onFieldEvent","autoPositionUpdate","bind","noAnimation","formElem","updatePromptsPosition","_submitButtonClick","removeData","_onSubmitEvent","detach","not","valid","hasClass","_validateFields","onSuccess","onFailure","closest","_validateField","onFieldSuccess","onFieldFailure","InvalidFields","onValidationComplete","prettySelect","usePrefix","useSuffix","prompt","_getPrompt","promptText","_updatePrompt","undefined","showPrompt","promptPosition","showArrow","_showPrompt","closingtag","fadeDuration","_getClassName","fadeTo","hideAll","eventTrigger","submitButton","ajaxFormValidation","_validateFormWithAjax","_checkAjaxStatus","status","ajaxValidCache","key","_checkAjaxFieldStatus","fieldid","errorFound","trigger","first_err","names","_jqSelector","doNotShowAllErrosOnSubmit","showOneMessage","destination","fixleft","positionType","prompt_err","scrollOffset","isOverflown","overflowDIV","overflownDIV","scrollContainerScroll","scrollContainerPos","scrollContainer","focusFirstField","scrollLeft","serialize","ajaxFormValidationMethod","ajaxFormValidationURL","beforeSend","onBeforeAjaxFormValidation","transport","_ajaxError","json","errorInForm","errorFieldId","errorField","msg","allrules","txt","showPrompts","_closePrompt","onAjaxFormComplete","skipAjaxValidation","fieldIdCounter","validateNonVisibleFields","rulesParsing","getRules","str","rules","isAjaxValidator","fieldName","promptType","limitErrors","isError","field_errors","have_required","errorMsg","_getErrorMessage","_required","_custom","classGroup","firstOfGroup","eq","_groupRequired","_ajax","_minSize","_maxSize","_min","_max","_past","_future","secondOfGroup","_dateRange","_dateTimeRange","_maxCheckbox","_minCheckbox","_equals","_funcCall","_creditCard","_condRequired","end_validation","message","fieldType","prop","errindex","splice","_handleStatusCssClasses","addSuccessCssClassToField","addFailureCssClassToField","rule","originalValidationMethod","rule_index","custom_validation_type","alteredRule","element_classes","element_classes_array","custom_message","_getCustomErrorMessage","classes","validityProp","test","_validityProp","custom_error_messages","element_class","custom","funcCall","condRequired","field_val","trim","dv_placeholder","customRule","alert","ex","functionName","namespaces","shift","customFunctions","equalsField","len","parseFloat","pdate","fieldAlt","_parseDate","vdate","_dateToString","_isDate","dateRegEx","_isDateTime","dateTimeRegEx","_dateCompare","start","end","toString","nbCheck","groupname","groupSize","cardNumber","numDigits","digit","luhn","errorSelector","extraDataDynamic","fieldId","fieldValue","tempData","values","domIds","inputValue","escape","console","log","d","dateParts","ajaxed","ajaxform","_buildPrompt","arrow","addPromptClass","requiredOverride","next","prettyOverrideClass","substr","opacity","_calculatePosition","callerTopPosition","callerleftPosition","marginTopSize","autoHidePrompt","autoHideDelay","closePrompt","formId","className","_escapeExpression","selector","isRTL","$document","$body","rtl","Boolean","promptElmt","promptTopPosition","promptleftPosition","fieldWidth","fieldLeft","fieldTop","promptHeight","shift1","shift2","shiftX","shiftY","idx","dependingField","first","button","apply","Array","call","bindMethod","inlineAjax","noop","modal","controllers","directives","services","filters","helpers","loading","validation","notifications","config","$routeProvider","$locationProvider","when","templateUrl","otherwise","redirectTo","html5Mode","run","$rootScope","$anchorScroll","$on","checkLogin","modals","active","reload","close","unbind","isArray","service","$q","sayMyName","displayName","profiles","getUserForScope","deferred","defer","hasDisplayName","attachDisplayNameToScope","resolve","errors","code","promise","showFeedback","resolveCardType","accountNumber","checkCreditCard","readOnlyCreditCard","updatedProfile","sendFormData","formData","acctNumber","xhr","complete","headers","Content-Type","crossDomain","xhrFields","withCredentials","frames","res","redactedAccount","expDate","Year","Month"],"mappings":"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","file":"bundle.js","sourcesContent":["/* Controllers */\r\n(function (angular) {\r\n\r\n 'use strict';\r\n\r\n function assignUserOnScope(scope) {\r\n return function (newScope) {\r\n _.assign(scope, newScope);\r\n };\r\n }\r\n\r\n angular.module('fastActionApp.controllers', []).\r\n controller('FrontController', function ($scope, $http, $location, $anchorScroll, userService) {\r\n _.assign($scope, window.user);\r\n var filterPath = function (string) {\r\n return string\r\n .replace(/^\\//, '')\r\n .replace(/(index|default).[a-zA-Z]{3,4}$/, '')\r\n .replace(/\\/$/, '');\r\n };\r\n\r\n // use the first element that is \"scrollable\"\r\n var scrollableElement = function (els) {\r\n for (var i = 0, argLength = arguments.length; i < argLength; i++) {\r\n var el = arguments[i],\r\n $scrollElement = $(el);\r\n if ($scrollElement.scrollTop() > 0) {\r\n return el;\r\n } else {\r\n $scrollElement.scrollTop(1);\r\n var isScrollable = $scrollElement.scrollTop() > 0;\r\n $scrollElement.scrollTop(0);\r\n if (isScrollable) {\r\n return el;\r\n }\r\n }\r\n }\r\n return [];\r\n };\r\n\r\n var locationPath = filterPath(location.pathname);\r\n var scrollElem = scrollableElement('html', 'body');\r\n\r\n $('a[href*=\"#\"]').filter('[data-no-jump]').each(function () {\r\n var thisPath = filterPath(this.pathname) || locationPath;\r\n if (locationPath === thisPath &&\r\n (location.hostname === this.hostname || !this.hostname) &&\r\n this.hash.replace(/#/, '')) {\r\n var target = this.hash, $target = $(target);\r\n if (target && $target.length) {\r\n var targetOffset = $target.offset().top;\r\n $(this).click(function (e) {\r\n e.preventDefault();\r\n $(scrollElem).animate({\r\n scrollTop: targetOffset\r\n }, 400, function () {\r\n location.hash = target;\r\n });\r\n });\r\n }\r\n }\r\n });\r\n }).\r\n controller('ProfileController', function ($location, $window, $http, $scope, userService, profile) {\r\n _.assign($scope, window.user);\r\n var validateVgsHiddenCcInput = _.debounce(function (fakeInput) {\r\n // Enters dummy input to the div so that the validation engine can properly validate it\r\n // and show/hide the error prompt if necessary. We need to fill in a value and validate so that\r\n // validation for other fields on the form can trigger if needed.\r\n var ccElem = $('#vgs-account-hidden');\r\n if (ccElem) {\r\n ccElem.val(fakeInput);\r\n ccElem.validationEngine('validate');\r\n }\r\n }, 100);\r\n\r\n var validateVgsHiddenDateInput = _.debounce(function(fakeInput) {\r\n var dateElem = $('#vgs-expdate-hidden');\r\n if (dateElem) {\r\n dateElem.val(fakeInput);\r\n dateElem.validationEngine('validate');\r\n }\r\n }, 100);\r\n\r\n var secureForm, secureAccountField, secureExpDate;\r\n var attachVgsFields = function(secureForm) {\r\n if (!secureForm) {\r\n return secureForm;\r\n }\r\n if (!secureAccountField) {\r\n secureAccountField = secureForm.field('#vgs-account', {\r\n type: 'card-number',\r\n name: 'Account',\r\n placeholder: '\\u25CF\\u25CF\\u25CF\\u25CF \\u25CF\\u25CF\\u25CF\\u25CF \\u25CF\\u25CF\\u25CF\\u25CF \\u25CF\\u25CF\\u25CF\\u25CF',\r\n autoComplete: 'cc-number',\r\n validations: ['validCardNumber'],\r\n css: {\r\n fontFamily: 'monospace',\r\n fontSize: '15px',\r\n '&::placeholder': {\r\n color: '#c4cfdd'\r\n }\r\n }\r\n });\r\n }\r\n if (!secureExpDate) {\r\n secureExpDate = secureForm.field('#vgs-expdate', {\r\n type: 'card-expiration-date',\r\n name: 'ExpirationDate',\r\n autoComplete: 'cc-exp',\r\n placeholder: 'MM / YYYY',\r\n validations: ['validCardExpirationDate'],\r\n serializers: [(secureForm.SERIALIZERS.separate({monthName: 'Month', yearName: 'Year'}))],\r\n css: {\r\n fontFamily: 'monospace',\r\n fontSize: '15px',\r\n '&::placeholder': {\r\n color: '#c4cfdd'\r\n }\r\n }\r\n });\r\n }\r\n\r\n return secureForm;\r\n };\r\n\r\n $scope.vgsConfigured = false;\r\n $scope.initProfile = function() {\r\n var vgsVaultId = window.vgsVaultId;\r\n if (window.VGSCollect && vgsVaultId) {\r\n // create VGS COllect form\r\n secureForm = window.VGSCollect.create(vgsVaultId, function(formState){\r\n // listen for event changes so that we can mimic the inline jquery validation\r\n if (formState) {\r\n if (formState.Account) {\r\n var accountElem = $('#vgs-account-hidden');\r\n var accountState = formState.Account;\r\n // enter fake input into the div and call the validation engine to validate the input\r\n if (accountState.isValid) {\r\n validateVgsHiddenCcInput('4111111111111111');\r\n } else if (accountState.isEmpty) {\r\n validateVgsHiddenCcInput('');\r\n } else {\r\n validateVgsHiddenCcInput('4141');\r\n }\r\n accountElem.toggleClass('focus', accountState.isFocused);\r\n }\r\n if (formState.ExpirationDate) {\r\n var expDateElem = $('#vgs-expdate-hidden');\r\n var expDateState = formState.ExpirationDate;\r\n // enter fake input into the div and call the validation engine to validate the input\r\n if (expDateState.isValid) {\r\n var today = new Date();\r\n validateVgsHiddenDateInput(today.toDateString());\r\n } else if (expDateState.isEmpty) {\r\n validateVgsHiddenDateInput('');\r\n } else {\r\n validateVgsHiddenDateInput('notvaliddate');\r\n }\r\n expDateElem.toggleClass('focus', expDateState.isFocused);\r\n }\r\n }\r\n });\r\n if (secureForm) {\r\n $scope.vgsConfigured = true;\r\n if (!$scope.$$phase) {\r\n $scope.$apply();\r\n }\r\n }\r\n }\r\n\r\n $scope.showVgs = function() {\r\n if ($scope.showCreditCardInput && secureForm) {\r\n secureForm = attachVgsFields(secureForm);\r\n }\r\n };\r\n\r\n $scope.displayCreditCardField = function () {\r\n $scope.showCreditCardInput = true;\r\n $scope.showCancelButton = true;\r\n $scope.focusCreditCardInput = true;\r\n\r\n if (secureForm) {\r\n secureForm = attachVgsFields(secureForm);\r\n }\r\n };\r\n\r\n $scope.cancelChanges = function() {\r\n $scope.showCreditCardInput = false;\r\n $scope.showCancelButton = false;\r\n\r\n if (secureForm) {\r\n if (secureAccountField) {\r\n secureAccountField.delete();\r\n secureAccountField = null;\r\n }\r\n if (secureExpDate) {\r\n secureExpDate.delete();\r\n secureExpDate = null;\r\n }\r\n }\r\n };\r\n\r\n $scope.getDatabagForFields = function($fields){\r\n $.ajax({\r\n url: '//profile.ngpvan.com/v2/data/' + $scope.id + '/fastaction',\r\n dataType: 'json'\r\n }).\r\n then(function (profile){\r\n $fields.each(function(){\r\n var value = profile[this.name];\r\n if (value) { this.value = value }\r\n });\r\n });\r\n };\r\n\r\n var $fields = $('form.prefill').find('input[name], select[name]');\r\n if ($fields.length) {\r\n $scope.getDatabagForFields($fields);\r\n }\r\n\r\n var profileSendSuccessCallback = function(resp) {\r\n return $scope.$apply(function(){\r\n if (resp==null) { return false; }\r\n $scope.primaryCard = resp.primaryCard;\r\n $scope.additionalCards = resp.additionalCards;\r\n\r\n $scope.showCreditCardInput=resp.showCreditCardInput;\r\n $scope.showCancelButton=resp.showCancelButton;\r\n });\r\n };\r\n\r\n $scope.submit = function(){\r\n profile.validate() && profile.send(secureForm, profileSendSuccessCallback);\r\n };\r\n\r\n var reallyRemove = function(provider){\r\n var providerName = {\r\n actionid: 'ActionID'\r\n };\r\n\r\n provider = providerName[provider] ? providerName[provider] : provider;\r\n return 'By removing your only login you will be unable to use this FastAction profile from other devices.\\n\\nAre you sure you want to remove your '+ provider +' login?';\r\n };\r\n\r\n $scope.removing = {};\r\n $scope.deauthProvider = function(provider){\r\n if (_.keys($scope.authProviders).length === 1 && !window.confirm(reallyRemove(provider))) {\r\n return false;\r\n }\r\n $scope.removing[provider] = true;\r\n $http({\r\n timeout: 5000,\r\n method: 'DELETE',\r\n url: '/api/authProviders/' + provider\r\n }).\r\n success(function (data) {\r\n delete $scope.removing[provider];\r\n window.user.authProviders = $scope.authProviders = data;\r\n window.user.isAuthenticated = $scope.isAuthenticated = !!_.keys($scope.authProviders).length;\r\n })\r\n .error(function(){\r\n delete $scope.removing[provider];\r\n });\r\n };\r\n\r\n $scope.authProvider = function(e){\r\n e.preventDefault();\r\n e.stopPropagation();\r\n var popup, pop = {\r\n left: 0,\r\n top: 0,\r\n width: 1000,\r\n height: 640\r\n };\r\n\r\n if (screen && screen.width && screen.height) {\r\n pop.top = ~~((screen.height/2) - (pop.height/2));\r\n pop.left = ~~((screen.width/2) - (pop.width/2));\r\n }\r\n\r\n popup = window.open(e.currentTarget.href, 'authProvider', 'toolbar=0,menubar=0,location=0,status=0,scrollbars=1,resizable=0,' + $.param(pop).replace(/&/g,','));\r\n\r\n (function checkPopup(){\r\n if (!popup || popup.closed) {\r\n $window.location.href = $location.path();\r\n } else {\r\n setTimeout(checkPopup, 1000/60);\r\n }\r\n })();\r\n };\r\n\r\n $scope.fetchProviders = function(){\r\n $http({\r\n cache: false,\r\n method: 'GET',\r\n url: '/api/authProviders'\r\n }).\r\n success(function (data) {\r\n if (_.size($scope.authProviders) < _.size(data)) {\r\n var $fields = $('form').find('input[name], select[name]');\r\n $scope.getDatabagForFields($fields);\r\n }\r\n window.user.authProviders = $scope.authProviders = data;\r\n window.user.isAuthenticated = $scope.isAuthenticated = !_.isEmpty($scope.authProviders);\r\n });\r\n };\r\n\r\n $scope.deleteAccount = function(){\r\n var $profile = $('.profile-page');\r\n if (window.confirm('Are you sure you want to delete your FastAction profile?\\n\\nWe store your encrypted payment information securely so that you can easily donate with a single click.')) {\r\n $profile.isLoading({\r\n text: 'Deleting Profile',\r\n position: 'overlay'\r\n });\r\n $http({\r\n cache: false,\r\n method: 'DELETE',\r\n url: '/profile'\r\n }).\r\n success(function (data) {\r\n $profile.isLoading('hide');\r\n $profile.isLoading({\r\n text: 'Your FastAction profile has been deleted. Your payment information is no longer stored.',\r\n position: 'overlay'\r\n });\r\n setTimeout(function(){\r\n window.location.pathname = '/logout';\r\n }, 1000);\r\n });\r\n }\r\n };\r\n };\r\n }).\r\n controller('HardReloadController', function ($scope, $location, $window) {\r\n // Force a hard reload\r\n $window.location.href = $location.path();\r\n }).\r\n controller('TransactionsController', function ($scope, $http, userService) {\r\n _.assign($scope, window.user);\r\n }).\r\n controller('IESucks', function ($scope) {\r\n $scope.loggedin = false;\r\n $scope.user = {};\r\n });\r\n})(angular);\r\n","/* Directives */\r\n(function(angular) {\r\n 'use strict';\r\n var app = angular.module('fastActionApp.directives', []);\r\n app.directive('appVersion', function(version) {\r\n return function(scope, elm, attrs) {\r\n elm.text(version);\r\n };\r\n });\r\n app.directive('focusMe', function($timeout, $parse) {\r\n return {\r\n //scope: true, // optionally create a child scope\r\n link: function(scope, element, attrs) {\r\n var model = $parse(attrs.focusMe);\r\n scope.$watch(model, function(value) {\r\n if (value === true) {\r\n $timeout(function() {\r\n element[0].focus();\r\n });\r\n }\r\n });\r\n }\r\n };\r\n });\r\n\r\n app.directive('mask', function() {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, element, attrs) {\r\n $(element).mask(attrs.mask);\r\n }\r\n };\r\n });\r\n\r\n app.directive('placeholder', function() {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, element, attrs) {\r\n if ($.fn.placeholder) {\r\n $(element).placeholder();\r\n }\r\n }\r\n };\r\n });\r\n\r\n app.directive('validation', function() {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, element, attrs) {\r\n $(element).validationEngine({\r\n maxErrorsPerField: 1\r\n });\r\n }\r\n };\r\n });\r\n\r\n app.directive('validate', function() {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, element, attrs) {\r\n element.addClass(\"validate[\" + attrs.validate + \"]\");\r\n }\r\n };\r\n });\r\n\r\n app.directive('requiredIndicator', function() {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, element, attrs) {\r\n element.append('<span class=\"requiredIndicator\">' + attrs.requiredIndicator + '</span>');\r\n }\r\n };\r\n });\r\n\r\n app.directive('sticky', function() {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, element, attrs) {\r\n var navHeight = $(\"nav.app-nav\").height();\r\n var bannerHeight = $(\".people-banner\").height();\r\n var bannerTop = $(\".people-banner\").position().top;\r\n\r\n //Sticky menu\r\n $(window).off('scroll.sticky').on('scroll.sticky', function(event) {\r\n var top = 0;\r\n var marginTop = 100 + navHeight;\r\n\r\n if ($(window).scrollTop() < bannerHeight) {\r\n top = -19 - $(window).scrollTop();\r\n marginTop = bannerTop + bannerHeight + navHeight;\r\n }\r\n\r\n $(element).css({\r\n top: top,\r\n marginTop: marginTop\r\n });\r\n });\r\n }\r\n };\r\n });\r\n\r\n})(angular);","\r\n/* Filters */\r\n\r\n(function(angular) {\r\n\r\n angular.module('fastActionApp.filters', []).\r\n filter('interpolate', function (version) {\r\n return function (text) {\r\n return String(text).replace(/\\%VERSION\\%/mg, version);\r\n };\r\n });\r\n\r\n})(angular);\r\n","/* global Typekit, ga */\r\n//load special font\r\ntry {\r\n Typekit.load();\r\n} catch (e) {}\r\n\r\n//Special validation method for profile credit card expiration month\r\nwindow.checkExpirationMonth = function(field, rules, i, options) {\r\n /* jshint eqeqeq: false */\r\n var minMonth = new Date().getMonth() + 1;\r\n var minYear = new Date().getFullYear();\r\n if (\"20\" + $('[name=\"ExpirationYear\"]').val() == minYear && field.val() < minMonth) {\r\n return \"Expired month\";\r\n }\r\n};\r\n\r\nwindow.checkExpirationDate = function(field, rules, i, options) {\r\n var enteredDate = new Date(field.val());\r\n var minDate = new Date();\r\n var minMonth = minDate.getMonth();\r\n var minYear = minDate.getFullYear();\r\n\r\n if (isNaN(enteredDate.getTime()) ||\r\n (enteredDate.getMonth() < minMonth && enteredDate.getFullYear() <= minYear)) {\r\n return 'Invalid date';\r\n }\r\n};\r\n\r\nString.prototype.luhnCheck = function() {\r\n var luhnArr = [\r\n [0, 2, 4, 6, 8, 1, 3, 5, 7, 9],\r\n [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\r\n ],\r\n sum = 0;\r\n this.replace(/\\D+/g, \"\").replace(/[\\d]/g, function(c, p, o) {\r\n sum += luhnArr[(o.length - p) & 1][parseInt(c, 10)];\r\n });\r\n return (sum % 10 === 0) && (sum > 0);\r\n};\r\n\r\n//google analytics\r\n(function(i, s, o, g, r, a, m) {\r\n i['GoogleAnalyticsObject'] = r;\r\n i[r] = i[r] || function() {\r\n (i[r].q = i[r].q || []).push(arguments);\r\n }, i[r].l = 1 * new Date();\r\n a = s.createElement(o),\r\n m = s.getElementsByTagName(o)[0];\r\n a.async = 1;\r\n a.src = g;\r\n m.parentNode.insertBefore(a, m);\r\n})(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga');\r\nga('create', 'UA-28243511-7', 'ngpvan.com');\r\nga('send', 'pageview');\r\n\r\n//scroll to section process page\r\n$(document).on(\"click.sticky\", 'a[href*=#]:not([href=#])', function(event) {\r\n event.preventDefault();\r\n $(window).scroll();\r\n if (location.pathname.replace(/^\\//, '') === this.pathname.replace(/^\\//, '') || location.hostname === this.hostname) {\r\n var target = $(this.hash),\r\n headerHeight = $(\".app-header\").height() + 5; // Get fixed header height\r\n\r\n target = target.length ? target : $('#' + this.hash.slice(1));\r\n\r\n if (target.length) {\r\n $('html,body').animate({\r\n scrollTop: target.offset().top - headerHeight\r\n }, 300);\r\n return false;\r\n }\r\n }\r\n});","/*\r\n * \tEasy Notification - jQuery plugin\r\n *\twritten by Alen Grakalic\t\r\n *\thttp://cssglobe.com\r\n *\r\n *\tCopyright (c) 2011 Alen Grakalic (http://cssglobe.com)\r\n *\tDual licensed under the MIT (MIT-LICENSE.txt)\r\n *\tand GPL (GPL-LICENSE.txt) licenses.\r\n *\r\n *\tBuilt for jQuery library\r\n *\thttp://jquery.com\r\n *\r\n */\r\n\r\njQuery.easyNotification = function (options) {\r\n\r\n var defaults = {\t\r\n\t\tid: 'easyNotification',\r\n\t\ttext: 'Notification!',\t\t\r\n\t\tparent: 'body',\r\n\t\tprepend: true,\t\t\r\n\t\tsibling: '',\r\n\t\tbefore: true,\r\n\t\tcontainerClassName: 'alert alert-success success',\r\n\t\tcloseClassName: 'glyphicons glyphicons-remove-2 dismiss',\r\n\t\tcloseText: '',\r\n\t\tcookieEnable: false,\r\n\t\tcookieName: 'notification',\r\n\t\tcookieValue: '123425',\r\n\t\tcookieDays: 30,\t\t\r\n\t\tdelay: 0,\r\n\t\tautoClose: false,\r\n\t\tduration: 5000,\r\n\t\tcallback: function(){}\r\n\t}; \r\n\tif(typeof options == 'string') defaults.text = options;\r\n\tvar options = jQuery.extend(defaults, options); \r\n\t\r\n\tvar obj, timeout;\r\n\t\r\n\tfunction setCookie(name,value,days) {\r\n\t\tif (days) {\r\n\t\t\tvar date = new Date();\r\n\t\t\tdate.setTime(date.getTime()+(days*24*60*60*1000));\r\n\t\t\tvar expires = \"; expires=\"+date.toGMTString();\r\n\t\t}\r\n\t\telse var expires = \"\";\r\n\t\tdocument.cookie = name+\"=\"+value+expires+\"; path=/\";\r\n\t};\r\n\t\r\n\tfunction getCookie(name) {\r\n\t\tvar nameEQ = name + \"=\";\r\n\t\tvar ca = document.cookie.split(';');\r\n\t\tfor(var i=0;i < ca.length;i++) {\r\n\t\t\tvar c = ca[i];\r\n\t\t\twhile (c.charAt(0)==' ') c = c.substring(1,c.length);\r\n\t\t\tif (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);\r\n\t\t}\r\n\t\treturn null;\r\n\t};\r\n\t\r\n\tfunction deleteCookie(name) {\r\n\t\tsetCookie(name,\"\",-1);\r\n\t};\t\r\n\t\r\n\tfunction checkCookie(){\r\n\t\tvar cookieExist = false;\r\n\t\tif(options.cookieEnable){\r\n\t\t\tvar cookie = getCookie(options.cookieName);\r\n\t\t\tif (cookie == options.cookieValue) cookieExist = true;\r\n\t\t};\r\n\t\treturn cookieExist;\r\n\t};\r\n\t\r\n\tfunction hide(){\r\n\t\t$(obj).slideUp('fast');\r\n\t\tif(options.cookieEnable) setCookie(options.cookieName,options.cookieValue,options.cookieDays);\r\n\t\toptions.callback();\t\r\n\t\tclearTimeout(timeout);\r\n\t}\r\n\t\r\n\tfunction show(){\r\n\t\t\r\n\t\t$('#'+ options.id).remove();\r\n\t\tclearTimeout(timeout);\r\n\t\tobj = $('<div class=\"' + options.containerClassName + '\" id=\"'+ options.id +'\"><p>'+ options.text +'</p></div>');\r\n\t\t$('<a class=\"'+ options.closeClassName +'\">'+ options.closeText +'</a>')\r\n\t\t\t.click(function(){hide();})\r\n\t\t\t.appendTo(obj);\r\n\t\tif(options.sibling != ''){\r\n\t\t\tif(options.before) {\r\n\t\t\t\t$(obj).hide().insertBefore(options.sibling).fadeIn('fast');\r\n\t\t\t} else {\r\n\t\t\t\t$(obj).hide().insertAfter(options.sibling).fadeIn('fast');\r\n\t\t\t};\t\r\n\t\t} else {\r\n\t\t\tif(options.prepend) {\r\n\t\t\t\t$(obj).hide().prependTo(options.parent).fadeIn('fast');\r\n\t\t\t} else {\r\n\t\t\t\t$(obj).hide().appendTo(options.parent).fadeIn('fast');\r\n\t\t\t};\t\t\t\t\r\n\t\t}\r\n\t\tif (options.autoClose) timeout = setTimeout(hide,options.duration);\r\n\t};\r\n\t\r\n\tif (!checkCookie()) timeout = setTimeout(show,options.delay);\r\n\t\r\n};","/**\r\n* Loading plugin for jQuery\r\n* \r\n* Small helper to give the user a visual feedback that something is happening \r\n* when fetching/posting data\r\n* \r\n* USAGE:\r\n* - global overlay: $.isLoading();\r\n* - use javascript: $( selector ).isLoading();\r\n* - On non-form elements: $(\"div\").isLoading({ text: \"Loading\", position:'inside'});\r\n* - remove the loading element: $( selector ).isLoading( \"hide\" );\r\n*\r\n* @author Laurent Blanes <laurent.blanes@gmail.com>\r\n* ---\r\n* Copyright 2013, Laurent Blanes ( https://github.com/hekigan/is-loading )\r\n* \r\n* The MIT License (MIT)\r\n* \r\n* Copyright (c) 2013 Laurent Blanes\r\n* \r\n* Permission is hereby granted, free of charge, to any person obtaining a copy\r\n* of this software and associated documentation files (the \"Software\"), to deal\r\n* in the Software without restriction, including without limitation the rights\r\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n* copies of the Software, and to permit persons to whom the Software is\r\n* furnished to do so, subject to the following conditions:\r\n* \r\n* The above copyright notice and this permission notice shall be included in\r\n* all copies or substantial portions of the Software.\r\n* \r\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n* THE SOFTWARE.\r\n*/\r\n;(function ( $, window, document, undefined ) {\r\n\r\n // Create the defaults once\r\n var pluginName = \"isLoading\",\r\n defaults = {\r\n 'position': \"right\", // right | inside | overlay\r\n 'text': \"\", // Text to display next to the loader\r\n 'class': \"icon-refresh\", // loader CSS class\r\n 'tpl': '<span class=\"isloading-wrapper %wrapper%\">%text%<i class=\"%class% icon-spin\"></i></span>', // loader base Tag\r\n 'disableSource': true, // true | false\r\n 'disableOthers': []\r\n };\r\n\r\n // The actual plugin constructor\r\n function Plugin( element, options ) {\r\n this.element = element;\r\n \r\n // Merge user options with default ones\r\n this.options = $.extend( {}, defaults, options );\r\n\r\n this._defaults = defaults;\r\n this._name = pluginName;\r\n this._loader = null; // Contain the loading tag element\r\n\r\n this.init();\r\n }\r\n\r\n // Contructor function for the plugin (only once on page load)\r\n function contruct() {\r\n\r\n if ( !$[pluginName] ) {\r\n $.isLoading = function( opts ) {\r\n $( \"body\" ).isLoading( opts );\r\n };\r\n }\r\n }\r\n \r\n Plugin.prototype = {\r\n \r\n init: function() {\r\n \r\n if( $( this.element ).is( \"body\") ) {\r\n this.options.position = \"overlay\";\r\n }\r\n this.show();\r\n },\r\n\r\n show: function() {\r\n\r\n var tpl = this.options.tpl.replace( '%wrapper%', ' isloading-show ' + ' isloading-' + this.options.position );\r\n tpl = tpl.replace( '%class%', this.options['class'] );\r\n tpl = tpl.replace( '%text%', ( this.options.text !== \"\" ) ? this.options.text + ' ' : '' );\r\n this._loader = $( tpl );\r\n \r\n // Disable the element\r\n if( $( this.element ).is( \"input, textarea\" ) && true === this.options.disableSource ) {\r\n\r\n $( this.element ).attr( \"disabled\", \"disabled\" );\r\n\r\n }\r\n else if( true === this.options.disableSource ) {\r\n\r\n $( this.element ).addClass( \"disabled\" );\r\n\r\n }\r\n\r\n // Set position\r\n switch( this.options.position ) {\r\n\r\n case \"inside\":\r\n $( this.element ).html( this._loader );\r\n break;\r\n\r\n case \"overlay\":\r\n if( $( this.element ).is( \"body\") ) {\r\n $( \"body\" ).prepend( '<div class=\"isloading-overlay\" style=\"position:fixed; left:0; top:0; z-index: 999; background: rgba(236, 240, 242, 0.5); width: 100%; height: ' + $( this.element ).outerHeight() + 'px;\" />' );\r\n }\r\n else {\r\n var cssPosition = $( this.element ).css('position');\r\n var pos = null;\r\n \r\n if( 'relative' === cssPosition ) {\r\n pos = { 'top': 0, 'left': 0 };\r\n } else {\r\n pos = $( this.element ).position();\r\n }\r\n $( this.element ).prepend( '<div class=\"isloading-overlay\" style=\"position:absolute; top: ' + pos.top + 'px; left: ' + pos.left + 'px; z-index: 999; background: rgba(236, 240, 242, 0.5); width: ' + $( this.element ).outerWidth() + 'px; height: ' + $( this.element ).outerHeight() + 'px;\" />' );\r\n }\r\n\r\n $( \".isloading-overlay\" ).html( this._loader );\r\n break;\r\n\r\n default:\r\n $( this.element ).after( this._loader );\r\n break;\r\n }\r\n\r\n this.disableOthers();\r\n },\r\n\r\n hide: function() {\r\n\r\n if( \"overlay\" === this.options.position ) {\r\n\r\n $( \".isloading-overlay\" ).remove();\r\n\r\n } else {\r\n\r\n $( this._loader ).remove();\r\n $( this.element ).text( $( this.element ).attr( \"data-isloading-label\" ) );\r\n\r\n }\r\n\r\n $( this.element ).removeAttr(\"disabled\").removeClass(\"disabled\");\r\n\r\n this.enableOthers();\r\n },\r\n\r\n disableOthers: function() {\r\n $.each(this.options.disableOthers, function( i, e ) {\r\n var elt = $( e );\r\n if( elt.is( \"button, input, textarea\" ) ) {\r\n elt.attr( \"disabled\", \"disabled\" );\r\n }\r\n else {\r\n elt.addClass( \"disabled\" );\r\n }\r\n });\r\n },\r\n\r\n enableOthers: function() {\r\n $.each(this.options.disableOthers, function( i, e ) {\r\n var elt = $( e );\r\n if( elt.is( \"button, input, textarea\" ) ) {\r\n elt.removeAttr( \"disabled\" );\r\n }\r\n else {\r\n elt.removeClass( \"disabled\" );\r\n }\r\n });\r\n }\r\n };\r\n \r\n // Constructor\r\n $.fn[pluginName] = function ( options ) {\r\n return this.each(function () {\r\n if ( options && \"hide\" !== options || !$.data( this, \"plugin_\" + pluginName ) ) {\r\n $.data( this, \"plugin_\" + pluginName, new Plugin( this, options ) );\r\n } else {\r\n var elt = $.data( this, \"plugin_\" + pluginName );\r\n\r\n if( \"hide\" === options ) { elt.hide(); }\r\n else { elt.show(); }\r\n }\r\n });\r\n };\r\n \r\n contruct();\r\n\r\n})( jQuery, window, document );"," /**\r\n * jquery.mask.js\r\n * @version: v1.3.1\r\n * @author: Igor Escobar\r\n *\r\n * Created by Igor Escobar on 2012-03-10. Please report any bug at http://blog.igorescobar.com\r\n *\r\n * Copyright (c) 2012 Igor Escobar http://blog.igorescobar.com\r\n *\r\n * The MIT License (http://www.opensource.org/licenses/mit-license.php)\r\n *\r\n * Permission is hereby granted, free of charge, to any person\r\n * obtaining a copy of this software and associated documentation\r\n * files (the \"Software\"), to deal in the Software without\r\n * restriction, including without limitation the rights to use,\r\n * copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the\r\n * Software is furnished to do so, subject to the following\r\n * conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be\r\n * included in all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\r\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\r\n * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\r\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\r\n * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\r\n * OTHER DEALINGS IN THE SOFTWARE.\r\n */\r\n\r\n(function ($) {\r\n \"use strict\";\r\n var Mask = function (el, mask, options) {\r\n var jMask = this,\r\n el = $(el),\r\n old_value;\r\n\r\n mask = typeof mask == \"function\" ? mask(el.val(), options) : mask;\r\n\r\n jMask.init = function() {\r\n options = options || {};\r\n\r\n jMask.byPassKeys = [8, 9, 16, 37, 38, 39, 40, 46, 91];\r\n jMask.translation = {\r\n '0': {pattern: /\\d/},\r\n '9': {pattern: /\\d/, optional: true},\r\n '#': {pattern: /\\d/, recursive: true},\r\n 'A': {pattern: /[a-zA-Z0-9]/},\r\n 'S': {pattern: /[a-zA-Z]/}\r\n };\r\n\r\n jMask.translation = $.extend({}, jMask.translation, options.translation);\r\n jMask = $.extend(true, {}, jMask, options);\r\n\r\n el.each(function() {\r\n if (options.maxlength !== false)\r\n el.attr('maxlength', mask.length);\r\n\r\n el.attr('autocomplete', 'off');\r\n p.destroyEvents();\r\n p.events();\r\n p.val(p.getMasked());\r\n });\r\n };\r\n\r\n var p = {\r\n events: function() {\r\n el.on('keydown.mask', function() {\r\n old_value = p.val();\r\n });\r\n el.on('keyup.mask', p.behaviour);\r\n el.on(\"paste.mask\", function() {\r\n setTimeout(function() {\r\n el.keydown().keyup();\r\n }, 100);\r\n });\r\n },\r\n destroyEvents: function() {\r\n el.off('keydown.mask').off(\"keyup.mask\").off(\"paste.mask\");\r\n },\r\n val: function(v) {\r\n var isInput = el.get(0).tagName.toLowerCase() === \"input\";\r\n return arguments.length > 0 ? (isInput ? el.val(v) : el.text(v)) : (isInput ? el.val() : el.text());\r\n },\r\n behaviour: function(e) {\r\n e = e || window.event;\r\n if ($.inArray(e.keyCode || e.which, jMask.byPassKeys) === -1) {\r\n p.val(p.getMasked());\r\n return p.callbacks(e);\r\n }\r\n },\r\n getMasked: function () {\r\n var buf = [],\r\n value = p.val(),\r\n m = 0, maskLen = mask.length,\r\n v = 0, valLen = value.length,\r\n offset = 1, addMethod = \"push\",\r\n resetPos = -1,\r\n lastMaskChar,\r\n check;\r\n\r\n if (options.reverse) {\r\n addMethod = \"unshift\";\r\n offset = -1;\r\n lastMaskChar = 0;\r\n m = maskLen - 1;\r\n v = valLen - 1;\r\n check = function () {\r\n return m > -1 && v > -1;\r\n };\r\n } else {\r\n lastMaskChar = maskLen - 1;\r\n check = function () {\r\n return m < maskLen && v < valLen;\r\n };\r\n }\r\n\r\n while (check()) {\r\n var maskDigit = mask.charAt(m),\r\n valDigit = value.charAt(v),\r\n translation = jMask.translation[maskDigit];\r\n\r\n if (translation) {\r\n if (valDigit.match(translation.pattern)) {\r\n buf[addMethod](valDigit);\r\n if (translation.recursive) {\r\n if (resetPos == -1) {\r\n resetPos = m;\r\n } else if (m == lastMaskChar) {\r\n m = resetPos - offset;\r\n }\r\n if (lastMaskChar == resetPos)\r\n m -= offset;\r\n }\r\n m += offset;\r\n } else if (translation.optional) {\r\n m += offset;\r\n v -= offset;\r\n }\r\n v += offset;\r\n } else {\r\n buf[addMethod](maskDigit);\r\n if (valDigit == maskDigit)\r\n v += offset;\r\n m += offset;\r\n }\r\n }\r\n return buf.join(\"\");\r\n },\r\n callbacks: function (e) {\r\n var val = p.val(),\r\n changed = p.val() !== old_value;\r\n if (changed === true){\r\n if (typeof options.onChange == \"function\")\r\n options.onChange(val, e, el, options);\r\n }\r\n\r\n if (changed === true && typeof options.onKeyPress == \"function\")\r\n options.onKeyPress(val, e, el, options);\r\n\r\n if (typeof options.onComplete === \"function\" && val.length === mask.length)\r\n options.onComplete(val, e, el, options);\r\n }\r\n };\r\n\r\n // public methods\r\n jMask.remove = function() {\r\n p.destroyEvents();\r\n p.val(jMask.getCleanVal()).removeAttr('maxlength');\r\n };\r\n\r\n // get value without mask\r\n jMask.getCleanVal = function() {\r\n var buf = [],\r\n string = p.val();\r\n for (var m = 0, mLen = mask.length; m < mLen; m++) {\r\n if (jMask.translation[mask.charAt(m)])\r\n buf[\"push\"](string.charAt(m));\r\n }\r\n return buf.join(\"\");\r\n };\r\n\r\n jMask.init();\r\n };\r\n\r\n $.fn.mask = function(mask, options) {\r\n return this.each(function() {\r\n $(this).data('mask', new Mask(this, mask, options));\r\n });\r\n };\r\n\r\n $.fn.unmask = function() {\r\n return this.each(function() {\r\n $(this).data('mask').remove();\r\n });\r\n };\r\n\r\n // looking for inputs with data-mask attribute\r\n $('input[data-mask]').each(function() {\r\n var input = $(this),\r\n options = {};\r\n\r\n if (input.attr('data-mask-reverse') === 'true') {\r\n options['reverse'] = true;\r\n }\r\n\r\n if (input.attr('data-mask-maxlength') === 'false') {\r\n options['maxlength'] = false;\r\n }\r\n\r\n input.mask(input.attr('data-mask'), options);\r\n });\r\n\r\n})(window.jQuery || window.Zepto);\r\n","(function($){\r\n $.fn.validationEngineLanguage = function(){\r\n };\r\n $.validationEngineLanguage = {\r\n newLang: function(){\r\n $.validationEngineLanguage.allRules = {\r\n \"required\": { // Add your regex rules here, you can take telephone as an example\r\n \"regex\": \"none\",\r\n \"alertText\": \"This field is required\",\r\n \"alertTextCheckboxMultiple\": \"Please select an option\",\r\n \"alertTextCheckboxe\": \"This checkbox is required\",\r\n \"alertTextDateRange\": \"Both date range fields are required\"\r\n },\r\n \"requiredInFunction\": { \r\n \"func\": function(field, rules, i, options){\r\n return (field.val() == \"test\") ? true : false;\r\n },\r\n \"alertText\": \"Field must equal test\"\r\n },\r\n \"dateRange\": {\r\n \"regex\": \"none\",\r\n \"alertText\": \"Invalid \",\r\n \"alertText2\": \"Date Range\"\r\n },\r\n \"dateTimeRange\": {\r\n \"regex\": \"none\",\r\n \"alertText\": \"Invalid \",\r\n \"alertText2\": \"Date Time Range\"\r\n },\r\n \"minSize\": {\r\n \"regex\": \"none\",\r\n \"alertText\": \"Minimum \",\r\n \"alertText2\": \" characters required\"\r\n },\r\n \"maxSize\": {\r\n \"regex\": \"none\",\r\n \"alertText\": \"Maximum \",\r\n \"alertText2\": \" characters allowed\"\r\n },\r\n\t\t\t\t\"groupRequired\": {\r\n \"regex\": \"none\",\r\n \"alertText\": \"You must fill one of the following fields\"\r\n },\r\n \"min\": {\r\n \"regex\": \"none\",\r\n \"alertText\": \"Minimum value is \"\r\n },\r\n \"max\": {\r\n \"regex\": \"none\",\r\n \"alertText\": \"Maximum value is \"\r\n },\r\n \"past\": {\r\n \"regex\": \"none\",\r\n \"alertText\": \"Date prior to \"\r\n },\r\n \"future\": {\r\n \"regex\": \"none\",\r\n \"alertText\": \"Date past \"\r\n },\t\r\n \"maxCheckbox\": {\r\n \"regex\": \"none\",\r\n \"alertText\": \"Maximum \",\r\n \"alertText2\": \" options allowed\"\r\n },\r\n \"minCheckbox\": {\r\n \"regex\": \"none\",\r\n \"alertText\": \"Please select \",\r\n \"alertText2\": \" options\"\r\n },\r\n \"equals\": {\r\n \"regex\": \"none\",\r\n \"alertText\": \"Fields do not match\"\r\n },\r\n \"creditCard\": {\r\n \"regex\": \"none\",\r\n \"alertText\": \"Invalid credit card number\"\r\n },\r\n \"phone\": {\r\n // credit: jquery.h5validate.js / orefalo\r\n \"regex\": /^([\\+][0-9]{1,3}[\\ \\.\\-])?([\\(]{1}[0-9]{2,6}[\\)])?([0-9\\ \\.\\-\\/]{3,20})((x|ext|extension)[\\ ]?[0-9]{1,4})?$/,\r\n \"alertText\": \"Invalid phone number\"\r\n },\r\n \"email\": {\r\n // HTML5 compatible email regex ( http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html# e-mail-state-%28type=email%29 )\r\n \"regex\": /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/,\r\n \"alertText\": \"Invalid email address\"\r\n },\r\n \"integer\": {\r\n \"regex\": /^[\\-\\+]?\\d+$/,\r\n \"alertText\": \"Not a valid integer\"\r\n },\r\n \"number\": {\r\n // Number, including positive, negative, and floating decimal. credit: orefalo\r\n \"regex\": /^[\\-\\+]?((([0-9]{1,3})([,][0-9]{3})*)|([0-9]+))?([\\.]([0-9]+))?$/,\r\n \"alertText\": \"Invalid floating decimal number\"\r\n },\r\n \"date\": { \r\n //\tCheck if date is valid by leap year\r\n\t\t\t\"func\": function (field) {\r\n\t\t\t\t\tvar pattern = new RegExp(/^(\\d{4})[\\/\\-\\.](0?[1-9]|1[012])[\\/\\-\\.](0?[1-9]|[12][0-9]|3[01])$/);\r\n\t\t\t\t\tvar match = pattern.exec(field.val());\r\n\t\t\t\t\tif (match == null)\r\n\t\t\t\t\t return false;\r\n\t\r\n\t\t\t\t\tvar year = match[1];\r\n\t\t\t\t\tvar month = match[2]*1;\r\n\t\t\t\t\tvar day = match[3]*1;\t\t\t\t\t\r\n\t\t\t\t\tvar date = new Date(year, month - 1, day); // because months starts from 0.\r\n\t\r\n\t\t\t\t\treturn (date.getFullYear() == year && date.getMonth() == (month - 1) && date.getDate() == day);\r\n\t\t\t\t}, \t\t\r\n\t\t\t \"alertText\": \"Invalid date, must be in YYYY-MM-DD format\"\r\n },\r\n \"ipv4\": {\r\n \"regex\": /^((([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))$/,\r\n \"alertText\": \"Invalid IP address\"\r\n },\r\n \"url\": {\r\n \"regex\": /^(https?|ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i,\r\n \"alertText\": \"Invalid URL\"\r\n },\r\n \"onlyNumberSp\": {\r\n \"regex\": /^[0-9\\ ]+$/,\r\n \"alertText\": \"Numbers only\"\r\n },\r\n \"onlyLetterSp\": {\r\n \"regex\": /^[a-zA-Z\\ \\']+$/,\r\n \"alertText\": \"Letters only\"\r\n },\r\n \"onlyLetterNumber\": {\r\n \"regex\": /^[0-9a-zA-Z]+$/,\r\n \"alertText\": \"No special characters allowed\"\r\n },\r\n // --- CUSTOM RULES -- Those are specific to the demos, they can be removed or changed to your likings\r\n \"ajaxUserCall\": {\r\n \"url\": \"ajaxValidateFieldUser\",\r\n // you may want to pass extra data on the ajax call\r\n \"extraData\": \"name=eric\",\r\n \"alertText\": \"This user is already taken\",\r\n \"alertTextLoad\": \"Validating, please wait\"\r\n },\r\n\t\t\t\t\"ajaxUserCallPhp\": {\r\n \"url\": \"phpajax/ajaxValidateFieldUser.php\",\r\n // you may want to pass extra data on the ajax call\r\n \"extraData\": \"name=eric\",\r\n // if you provide an \"alertTextOk\", it will show as a green prompt when the field validates\r\n \"alertTextOk\": \"This username is available\",\r\n \"alertText\": \"This user is already taken\",\r\n \"alertTextLoad\": \"Validating, please wait\"\r\n },\r\n \"ajaxNameCall\": {\r\n // remote json service location\r\n \"url\": \"ajaxValidateFieldName\",\r\n // error\r\n \"alertText\": \"This name is already taken\",\r\n // if you provide an \"alertTextOk\", it will show as a green prompt when the field validates\r\n \"alertTextOk\": \"This name is available\",\r\n // speaks by itself\r\n \"alertTextLoad\": \"Validating, please wait\"\r\n },\r\n\t\t\t\t \"ajaxNameCallPhp\": {\r\n\t // remote json service location\r\n\t \"url\": \"phpajax/ajaxValidateFieldName.php\",\r\n\t // error\r\n\t \"alertText\": \"This name is already taken\",\r\n\t // speaks by itself\r\n\t \"alertTextLoad\": \"Validating, please wait\"\r\n\t },\r\n \"validate2fields\": {\r\n \"alertText\": \"Please input HELLO\"\r\n },\r\n\t //tls warning:homegrown not fielded \r\n \"dateFormat\":{\r\n \"regex\": /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$|^(?:(?:(?:0?[13578]|1[02])(\\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\\/|-)(?:29|30)))(\\/|-)(?:[1-9]\\d\\d\\d|\\d[1-9]\\d\\d|\\d\\d[1-9]\\d|\\d\\d\\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\\/|-)(?:0?[1-9]|1\\d|2[0-8]))(\\/|-)(?:[1-9]\\d\\d\\d|\\d[1-9]\\d\\d|\\d\\d[1-9]\\d|\\d\\d\\d[1-9])$|^(0?2(\\/|-)29)(\\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\\d\\d)?(?:0[48]|[2468][048]|[13579][26]))$/,\r\n \"alertText\": \"Invalid Date\"\r\n },\r\n //tls warning:homegrown not fielded \r\n\t\t\t\t\"dateTimeFormat\": {\r\n\t \"regex\": /^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])\\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\\s+(am|pm|AM|PM){1}$|^(?:(?:(?:0?[13578]|1[02])(\\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\\/|-)(?:29|30)))(\\/|-)(?:[1-9]\\d\\d\\d|\\d[1-9]\\d\\d|\\d\\d[1-9]\\d|\\d\\d\\d[1-9])$|^((1[012]|0?[1-9]){1}\\/(0?[1-9]|[12][0-9]|3[01]){1}\\/\\d{2,4}\\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\\s+(am|pm|AM|PM){1})$/,\r\n \"alertText\": \"Invalid Date or Date Format\",\r\n \"alertText2\": \"Expected Format: \",\r\n \"alertText3\": \"mm/dd/yyyy hh:mm:ss AM|PM or \", \r\n \"alertText4\": \"yyyy-mm-dd hh:mm:ss AM|PM\"\r\n\t }\r\n };\r\n \r\n }\r\n };\r\n\r\n $.validationEngineLanguage.newLang();\r\n \r\n})(jQuery);\r\n","require('./jquery.validationEngine-en');\r\n/*\r\n * Inline Form Validation Engine 2.6.2, jQuery plugin\r\n *\r\n * Copyright(c) 2010, Cedric Dugas\r\n * http://www.position-absolute.com\r\n *\r\n * 2.0 Rewrite by Olivier Refalo\r\n * http://www.crionics.com\r\n *\r\n * Form validation engine allowing custom regex rules to be added.\r\n * Licensed under the MIT License\r\n */\r\n (function($) {\r\n\r\n\t\"use strict\";\r\n\r\n\tvar methods = {\r\n\r\n\t\t/**\r\n\t\t* Kind of the constructor, called before any action\r\n\t\t* @param {Map} user options\r\n\t\t*/\r\n\t\tinit: function(options) {\r\n\t\t\tvar form = this;\r\n\t\t\tif (!form.data('jqv') || form.data('jqv') == null ) {\r\n\t\t\t\toptions = methods._saveOptions(form, options);\r\n\t\t\t\t// bind all formError elements to close on click\r\n\t\t\t\t$(document).on(\"click\", \".formError\", function() {\r\n\t\t\t\t\t$(this).fadeOut(150, function() {\r\n\t\t\t\t\t\t// remove prompt once invisible\r\n\t\t\t\t\t\t$(this).parent('.formErrorOuter').remove();\r\n\t\t\t\t\t\t$(this).remove();\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t },\r\n\t\t/**\r\n\t\t* Attachs jQuery.validationEngine to form.submit and field.blur events\r\n\t\t* Takes an optional params: a list of options\r\n\t\t* ie. jQuery(\"#formID1\").validationEngine('attach', {promptPosition : \"centerRight\"});\r\n\t\t*/\r\n\t\tattach: function(userOptions) {\r\n\r\n\t\t\tvar form = this;\r\n\t\t\tvar options;\r\n\r\n\t\t\tif(userOptions)\r\n\t\t\t\toptions = methods._saveOptions(form, userOptions);\r\n\t\t\telse\r\n\t\t\t\toptions = form.data('jqv');\r\n\r\n\t\t\toptions.validateAttribute = (form.find(\"[data-validation-engine*=validate]\").length) ? \"data-validation-engine\" : \"class\";\r\n\t\t\tif (options.binded) {\r\n\r\n\t\t\t\t// delegate fields\r\n\t\t\t\tform.on(options.validationEventTrigger, \"[\"+options.validateAttribute+\"*=validate]:not([type=checkbox]):not([type=radio]):not(.datepicker)\", methods._onFieldEvent);\r\n\t\t\t\tform.on(\"click\", \"[\"+options.validateAttribute+\"*=validate][type=checkbox],[\"+options.validateAttribute+\"*=validate][type=radio]\", methods._onFieldEvent);\r\n\t\t\t\tform.on(options.validationEventTrigger,\"[\"+options.validateAttribute+\"*=validate][class*=datepicker]\", {\"delay\": 300}, methods._onFieldEvent);\r\n\t\t\t}\r\n\t\t\tif (options.autoPositionUpdate) {\r\n\t\t\t\t$(window).bind(\"resize\", {\r\n\t\t\t\t\t\"noAnimation\": true,\r\n\t\t\t\t\t\"formElem\": form\r\n\t\t\t\t}, methods.updatePromptsPosition);\r\n\t\t\t}\r\n\t\t\tform.on(\"click\",\"a[data-validation-engine-skip], a[class*='validate-skip'], button[data-validation-engine-skip], button[class*='validate-skip'], input[data-validation-engine-skip], input[class*='validate-skip']\", methods._submitButtonClick);\r\n\t\t\tform.removeData('jqv_submitButton');\r\n\r\n\t\t\t// bind form.submit\r\n\t\t\tform.on(\"submit\", methods._onSubmitEvent);\r\n\t\t\treturn this;\r\n\t\t},\r\n\t\t/**\r\n\t\t* Unregisters any bindings that may point to jQuery.validaitonEngine\r\n\t\t*/\r\n\t\tdetach: function() {\r\n\r\n\t\t\tvar form = this;\r\n\t\t\tvar options = form.data('jqv');\r\n\r\n\t\t\t// unbind fields\r\n\t\t\tform.find(\"[\"+options.validateAttribute+\"*=validate]\").not(\"[type=checkbox]\").off(options.validationEventTrigger, methods._onFieldEvent);\r\n\t\t\tform.find(\"[\"+options.validateAttribute+\"*=validate][type=checkbox],[class*=validate][type=radio]\").off(\"click\", methods._onFieldEvent);\r\n\r\n\t\t\t// unbind form.submit\r\n\t\t\tform.off(\"submit\", methods._onSubmitEvent);\r\n\t\t\tform.removeData('jqv');\r\n \r\n\t\t\tform.off(\"click\", \"a[data-validation-engine-skip], a[class*='validate-skip'], button[data-validation-engine-skip], button[class*='validate-skip'], input[data-validation-engine-skip], input[class*='validate-skip']\", methods._submitButtonClick);\r\n\t\t\tform.removeData('jqv_submitButton');\r\n\r\n\t\t\tif (options.autoPositionUpdate)\r\n\t\t\t\t$(window).off(\"resize\", methods.updatePromptsPosition);\r\n\r\n\t\t\treturn this;\r\n\t\t},\r\n\t\t/**\r\n\t\t* Validates either a form or a list of fields, shows prompts accordingly.\r\n\t\t* Note: There is no ajax form validation with this method, only field ajax validation are evaluated\r\n\t\t*\r\n\t\t* @return true if the form validates, false if it fails\r\n\t\t*/\r\n\t\tvalidate: function() {\r\n\t\t\tvar element = $(this);\r\n\t\t\tvar valid = null;\r\n\r\n\t\t\tif (element.is(\"form\") || element.hasClass(\"validationEngineContainer\")) {\r\n\t\t\t\tif (element.hasClass('validating')) {\r\n\t\t\t\t\t// form is already validating.\r\n\t\t\t\t\t// Should abort old validation and start new one. I don't know how to implement it.\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t} else {\t\t\t\t\r\n\t\t\t\t\telement.addClass('validating');\r\n\t\t\t\t\tvar options = element.data('jqv');\r\n\t\t\t\t\tvar valid = methods._validateFields(this);\r\n\r\n\t\t\t\t\t// If the form doesn't validate, clear the 'validating' class before the user has a chance to submit again\r\n\t\t\t\t\tsetTimeout(function(){\r\n\t\t\t\t\t\telement.removeClass('validating');\r\n\t\t\t\t\t}, 100);\r\n\t\t\t\t\tif (valid && options.onSuccess) {\r\n\t\t\t\t\t\toptions.onSuccess();\r\n\t\t\t\t\t} else if (!valid && options.onFailure) {\r\n\t\t\t\t\t\toptions.onFailure();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (element.is('form') || element.hasClass('validationEngineContainer')) {\r\n\t\t\t\telement.removeClass('validating');\r\n\t\t\t} else {\r\n\t\t\t\t// field validation\r\n\t\t\t\tvar form = element.closest('form, .validationEngineContainer'),\r\n\t\t\t\t\toptions = (form.data('jqv')) ? form.data('jqv') : $.validationEngine.defaults,\r\n\t\t\t\t\tvalid = methods._validateField(element, options);\r\n\r\n\t\t\t\tif (valid && options.onFieldSuccess)\r\n\t\t\t\t\toptions.onFieldSuccess();\r\n\t\t\t\telse if (options.onFieldFailure && options.InvalidFields.length > 0) {\r\n\t\t\t\t\toptions.onFieldFailure();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif(options.onValidationComplete) {\r\n\t\t\t\t// !! ensures that an undefined return is interpreted as return false but allows a onValidationComplete() to possibly return true and have form continue processing\r\n\t\t\t\treturn !!options.onValidationComplete(form, valid);\r\n\t\t\t}\r\n\t\t\treturn valid;\r\n\t\t},\r\n\t\t/**\r\n\t\t* Redraw prompts position, useful when you change the DOM state when validating\r\n\t\t*/\r\n\t\tupdatePromptsPosition: function(event) {\r\n\r\n\t\t\tif (event && this == window) {\r\n\t\t\t\tvar form = event.data.formElem;\r\n\t\t\t\tvar noAnimation = event.data.noAnimation;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\tvar form = $(this.closest('form, .validationEngineContainer'));\r\n\r\n\t\t\tvar options = form.data('jqv');\r\n\t\t\t// No option, take default one\r\n\t\t\tform.find('['+options.validateAttribute+'*=validate]').not(\":disabled\").each(function(){\r\n\t\t\t\tvar field = $(this);\r\n\t\t\t\tif (options.prettySelect && field.is(\":hidden\"))\r\n\t\t\t\t field = form.find(\"#\" + options.usePrefix + field.attr('id') + options.useSuffix);\r\n\t\t\t\tvar prompt = methods._getPrompt(field);\r\n\t\t\t\tvar promptText = $(prompt).find(\".formErrorContent\").html();\r\n\r\n\t\t\t\tif(prompt)\r\n\t\t\t\t\tmethods._updatePrompt(field, $(prompt), promptText, undefined, false, options, noAnimation);\r\n\t\t\t});\r\n\t\t\treturn this;\r\n\t\t},\r\n\t\t/**\r\n\t\t* Displays a prompt on a element.\r\n\t\t* Note that the element needs an id!\r\n\t\t*\r\n\t\t* @param {String} promptText html text to display type\r\n\t\t* @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)\r\n\t\t* @param {String} possible values topLeft, topRight, bottomLeft, centerRight, bottomRight\r\n\t\t*/\r\n\t\tshowPrompt: function(promptText, type, promptPosition, showArrow) {\r\n\t\t\tvar form = this.closest('form, .validationEngineContainer');\r\n\t\t\tvar options = form.data('jqv');\r\n\t\t\t// No option, take default one\r\n\t\t\tif(!options)\r\n\t\t\t\toptions = methods._saveOptions(this, options);\r\n\t\t\tif(promptPosition)\r\n\t\t\t\toptions.promptPosition=promptPosition;\r\n\t\t\toptions.showArrow = showArrow==true;\r\n\r\n\t\t\tmethods._showPrompt(this, promptText, type, false, options);\r\n\t\t\treturn this;\r\n\t\t},\r\n\t\t/**\r\n\t\t* Closes form error prompts, CAN be invidual\r\n\t\t*/\r\n\t\thide: function() {\r\n\t\t\t var form = $(this).closest('form, .validationEngineContainer');\r\n\t\t\t var options = form.data('jqv');\r\n\t\t\t var fadeDuration = (options && options.fadeDuration) ? options.fadeDuration : 0.3;\r\n\t\t\t var closingtag;\r\n\t\t\t \r\n\t\t\t if($(this).is(\"form\") || $(this).hasClass(\"validationEngineContainer\")) {\r\n\t\t\t\t closingtag = \"parentForm\"+methods._getClassName($(this).attr(\"id\"));\r\n\t\t\t } else {\r\n\t\t\t\t closingtag = methods._getClassName($(this).attr(\"id\")) +\"formError\";\r\n\t\t\t }\r\n\t\t\t $('.'+closingtag).fadeTo(fadeDuration, 0.3, function() {\r\n\t\t\t\t $(this).parent('.formErrorOuter').remove();\r\n\t\t\t\t $(this).remove();\r\n\t\t\t });\r\n\t\t\t return this;\r\n\t\t },\r\n\t\t /**\r\n\t\t * Closes all error prompts on the page\r\n\t\t */\r\n\t\t hideAll: function() {\r\n\r\n\t\t\t var form = this;\r\n\t\t\t var options = form.data('jqv');\r\n\t\t\t var duration = options ? options.fadeDuration:300;\r\n\t\t\t $('.formError').fadeTo(duration, 300, function() {\r\n\t\t\t\t $(this).parent('.formErrorOuter').remove();\r\n\t\t\t\t $(this).remove();\r\n\t\t\t });\r\n\t\t\t return this;\r\n\t\t },\r\n\t\t/**\r\n\t\t* Typically called when user exists a field using tab or a mouse click, triggers a field\r\n\t\t* validation\r\n\t\t*/\r\n\t\t_onFieldEvent: function(event) {\r\n\t\t\tvar field = $(this);\r\n\t\t\tvar form = field.closest('form, .validationEngineContainer');\r\n\t\t\tvar options = form.data('jqv');\r\n\t\t\toptions.eventTrigger = \"field\";\r\n\t\t\t// validate the current field\r\n\t\t\twindow.setTimeout(function() {\r\n\t\t\t\tmethods._validateField(field, options);\r\n\t\t\t\tif (options.InvalidFields.length == 0 && options.onFieldSuccess) {\r\n\t\t\t\t\toptions.onFieldSuccess();\r\n\t\t\t\t} else if (options.InvalidFields.length > 0 && options.onFieldFailure) {\r\n\t\t\t\t\toptions.onFieldFailure();\r\n\t\t\t\t}\r\n\t\t\t}, (event.data) ? event.data.delay : 0);\r\n\r\n\t\t},\r\n\t\t/**\r\n\t\t* Called when the form is submited, shows prompts accordingly\r\n\t\t*\r\n\t\t* @param {jqObject}\r\n\t\t* form\r\n\t\t* @return false if form submission needs to be cancelled\r\n\t\t*/\r\n\t\t_onSubmitEvent: function() {\r\n\t\t\tvar form = $(this);\r\n\t\t\tvar options = form.data('jqv');\r\n\t\t\t\r\n\t\t\t//check if it is trigger from skipped button\r\n\t\t\tif (form.data(\"jqv_submitButton\")){\r\n\t\t\t\tvar submitButton = $(\"#\" + form.data(\"jqv_submitButton\"));\r\n\t\t\t\tif (submitButton){\r\n\t\t\t\t\tif (submitButton.length > 0){\r\n\t\t\t\t\t\tif (submitButton.hasClass(\"validate-skip\") || submitButton.attr(\"data-validation-engine-skip\") == \"true\")\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\toptions.eventTrigger = \"submit\";\r\n\r\n\t\t\t// validate each field \r\n\t\t\t// (- skip field ajax validation, not necessary IF we will perform an ajax form validation)\r\n\t\t\tvar r=methods._validateFields(form);\r\n\r\n\t\t\tif (r && options.ajaxFormValidation) {\r\n\t\t\t\tmethods._validateFormWithAjax(form, options);\r\n\t\t\t\t// cancel form auto-submission - process with async call onAjaxFormComplete\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif(options.onValidationComplete) {\r\n\t\t\t\t// !! ensures that an undefined return is interpreted as return false but allows a onValidationComplete() to possibly return true and have form continue processing\r\n\t\t\t\treturn !!options.onValidationComplete(form, r);\r\n\t\t\t}\r\n\t\t\treturn r;\r\n\t\t},\r\n\t\t/**\r\n\t\t* Return true if the ajax field validations passed so far\r\n\t\t* @param {Object} options\r\n\t\t* @return true, is all ajax validation passed so far (remember ajax is async)\r\n\t\t*/\r\n\t\t_checkAjaxStatus: function(options) {\r\n\t\t\tvar status = true;\r\n\t\t\t$.each(options.ajaxValidCache, function(key, value) {\r\n\t\t\t\tif (!value) {\r\n\t\t\t\t\tstatus = false;\r\n\t\t\t\t\t// break the each\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\treturn status;\r\n\t\t},\r\n\t\t\r\n\t\t/**\r\n\t\t* Return true if the ajax field is validated\r\n\t\t* @param {String} fieldid\r\n\t\t* @param {Object} options\r\n\t\t* @return true, if validation passed, false if false or doesn't exist\r\n\t\t*/\r\n\t\t_checkAjaxFieldStatus: function(fieldid, options) {\r\n\t\t\treturn options.ajaxValidCache[fieldid] == true;\r\n\t\t},\r\n\t\t/**\r\n\t\t* Validates form fields, shows prompts accordingly\r\n\t\t*\r\n\t\t* @param {jqObject}\r\n\t\t* form\r\n\t\t* @param {skipAjaxFieldValidation}\r\n\t\t* boolean - when set to true, ajax field validation is skipped, typically used when the submit button is clicked\r\n\t\t*\r\n\t\t* @return true if form is valid, false if not, undefined if ajax form validation is done\r\n\t\t*/\r\n\t\t_validateFields: function(form) {\r\n\t\t\tvar options = form.data('jqv');\r\n\r\n\t\t\t// this variable is set to true if an error is found\r\n\t\t\tvar errorFound = false;\r\n\r\n\t\t\t// Trigger hook, start validation\r\n\t\t\tform.trigger(\"jqv.form.validating\");\r\n\t\t\t// first, evaluate status of non ajax fields\r\n\t\t\tvar first_err=null;\r\n\t\t\tform.find('['+options.validateAttribute+'*=validate]').not(\":disabled\").each( function() {\r\n\t\t\t\tvar field = $(this);\r\n\t\t\t\tvar names = [];\r\n\t\t\t\tif ($.inArray(field.attr('name'), names) < 0) {\r\n\t\t\t\t\terrorFound |= methods._validateField(field, options);\r\n\t\t\t\t\tif (errorFound && first_err==null)\r\n\t\t\t\t\t\tif (field.is(\":hidden\") && options.prettySelect)\r\n\t\t\t\t\t\t\tfirst_err = field = form.find(\"#\" + options.usePrefix + methods._jqSelector(field.attr('id')) + options.useSuffix);\r\n\t\t\t\t\t\telse {\r\n\r\n\t\t\t\t\t\t\t//Check if we need to adjust what element to show the prompt on\r\n\t\t\t\t\t\t\t//and and such scroll to instead\r\n\t\t\t\t\t\t\tif(field.data('jqv-prompt-at') instanceof jQuery ){\r\n\t\t\t\t\t\t\t\tfield = field.data('jqv-prompt-at');\r\n\t\t\t\t\t\t\t} else if(field.data('jqv-prompt-at')) {\r\n\t\t\t\t\t\t\t\tfield = $(field.data('jqv-prompt-at'));\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tfirst_err=field;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\tif (options.doNotShowAllErrosOnSubmit)\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\tnames.push(field.attr('name'));\r\n\r\n\t\t\t\t\t//if option set, stop checking validation rules after one error is found\r\n\t\t\t\t\tif(options.showOneMessage == true && errorFound){\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// second, check to see if all ajax calls completed ok\r\n\t\t\t// errorFound |= !methods._checkAjaxStatus(options);\r\n\r\n\t\t\t// third, check status and scroll the container accordingly\r\n\t\t\tform.trigger(\"jqv.form.result\", [errorFound]);\r\n\r\n\t\t\tif (errorFound) {\r\n\t\t\t\tif (options.scroll) {\r\n\t\t\t\t\tvar destination=first_err.offset().top;\r\n\t\t\t\t\tvar fixleft = first_err.offset().left;\r\n\r\n\t\t\t\t\t//prompt positioning adjustment support. Usage: positionType:Xshift,Yshift (for ex.: bottomLeft:+20 or bottomLeft:-20,+10)\r\n\t\t\t\t\tvar positionType=options.promptPosition;\r\n\t\t\t\t\tif (typeof(positionType)=='string' && positionType.indexOf(\":\")!=-1)\r\n\t\t\t\t\t\tpositionType=positionType.substring(0,positionType.indexOf(\":\"));\r\n\r\n\t\t\t\t\tif (positionType!=\"bottomRight\" && positionType!=\"bottomLeft\") {\r\n\t\t\t\t\t\tvar prompt_err= methods._getPrompt(first_err);\r\n\t\t\t\t\t\tif (prompt_err) {\r\n\t\t\t\t\t\t\tdestination=prompt_err.offset().top;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Offset the amount the page scrolls by an amount in px to accomodate fixed elements at top of page\r\n\t\t\t\t\tif (options.scrollOffset) {\r\n\t\t\t\t\t\tdestination -= options.scrollOffset;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// get the position of the first error, there should be at least one, no need to check this\r\n\t\t\t\t\t//var destination = form.find(\".formError:not('.greenPopup'):first\").offset().top;\r\n\t\t\t\t\tif (options.isOverflown) {\r\n\t\t\t\t\t\tvar overflowDIV = $(options.overflownDIV);\r\n\t\t\t\t\t\tif(!overflowDIV.length) return false;\r\n\t\t\t\t\t\tvar scrollContainerScroll = overflowDIV.scrollTop();\r\n\t\t\t\t\t\tvar scrollContainerPos = -parseInt(overflowDIV.offset().top);\r\n\r\n\t\t\t\t\t\tdestination += scrollContainerScroll + scrollContainerPos - 5;\r\n\t\t\t\t\t\tvar scrollContainer = $(options.overflownDIV + \":not(:animated)\");\r\n\r\n\t\t\t\t\t\tscrollContainer.animate({ scrollTop: destination }, 1100, function(){\r\n\t\t\t\t\t\t\tif(options.focusFirstField) first_err.focus();\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t$(\"html, body\").animate({\r\n\t\t\t\t\t\t\tscrollTop: destination\r\n\t\t\t\t\t\t}, 1100, function(){\r\n\t\t\t\t\t\t\tif(options.focusFirstField) first_err.focus();\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\t$(\"html, body\").animate({scrollLeft: fixleft},1100)\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else if(options.focusFirstField)\r\n\t\t\t\t\tfirst_err.focus();\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t},\r\n\t\t/**\r\n\t\t* This method is called to perform an ajax form validation.\r\n\t\t* During this process all the (field, value) pairs are sent to the server which returns a list of invalid fields or true\r\n\t\t*\r\n\t\t* @param {jqObject} form\r\n\t\t* @param {Map} options\r\n\t\t*/\r\n\t\t_validateFormWithAjax: function(form, options) {\r\n\r\n\t\t\tvar data = form.serialize();\r\n\t\t\t\t\t\t\t\t\tvar type = (options.ajaxFormValidationMethod) ? options.ajaxFormValidationMethod : \"GET\";\r\n\t\t\tvar url = (options.ajaxFormValidationURL) ? options.ajaxFormValidationURL : form.attr(\"action\");\r\n\t\t\t\t\t\t\t\t\tvar dataType = (options.dataType) ? options.dataType : \"json\";\r\n\t\t\t$.ajax({\r\n\t\t\t\ttype: type,\r\n\t\t\t\turl: url,\r\n\t\t\t\tcache: false,\r\n\t\t\t\tdataType: dataType,\r\n\t\t\t\tdata: data,\r\n\t\t\t\tform: form,\r\n\t\t\t\tmethods: methods,\r\n\t\t\t\toptions: options,\r\n\t\t\t\tbeforeSend: function() {\r\n\t\t\t\t\treturn options.onBeforeAjaxFormValidation(form, options);\r\n\t\t\t\t},\r\n\t\t\t\terror: function(data, transport) {\r\n\t\t\t\t\tif (options.onFailure) {\r\n\t\t\t\t\t\toptions.onFailure(data, transport);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tmethods._ajaxError(data, transport);\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tsuccess: function(json) {\r\n\t\t\t\t\tif ((dataType == \"json\") && (json !== true)) {\r\n\t\t\t\t\t\t// getting to this case doesn't necessary means that the form is invalid\r\n\t\t\t\t\t\t// the server may return green or closing prompt actions\r\n\t\t\t\t\t\t// this flag helps figuring it out\r\n\t\t\t\t\t\tvar errorInForm=false;\r\n\t\t\t\t\t\tfor (var i = 0; i < json.length; i++) {\r\n\t\t\t\t\t\t\tvar value = json[i];\r\n\r\n\t\t\t\t\t\t\tvar errorFieldId = value[0];\r\n\t\t\t\t\t\t\tvar errorField = $($(\"#\" + errorFieldId)[0]);\r\n\r\n\t\t\t\t\t\t\t// make sure we found the element\r\n\t\t\t\t\t\t\tif (errorField.length == 1) {\r\n\r\n\t\t\t\t\t\t\t\t// promptText or selector\r\n\t\t\t\t\t\t\t\tvar msg = value[2];\r\n\t\t\t\t\t\t\t\t// if the field is valid\r\n\t\t\t\t\t\t\t\tif (value[1] == true) {\r\n\r\n\t\t\t\t\t\t\t\t\tif (msg == \"\" || !msg){\r\n\t\t\t\t\t\t\t\t\t\t// if for some reason, status==true and error=\"\", just close the prompt\r\n\t\t\t\t\t\t\t\t\t\tmethods._closePrompt(errorField);\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t// the field is valid, but we are displaying a green prompt\r\n\t\t\t\t\t\t\t\t\t\tif (options.allrules[msg]) {\r\n\t\t\t\t\t\t\t\t\t\t\tvar txt = options.allrules[msg].alertTextOk;\r\n\t\t\t\t\t\t\t\t\t\t\tif (txt)\r\n\t\t\t\t\t\t\t\t\t\t\t\tmsg = txt;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tif (options.showPrompts) methods._showPrompt(errorField, msg, \"pass\", false, options, true);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t// the field is invalid, show the red error prompt\r\n\t\t\t\t\t\t\t\t\terrorInForm|=true;\r\n\t\t\t\t\t\t\t\t\tif (options.allrules[msg]) {\r\n\t\t\t\t\t\t\t\t\t\tvar txt = options.allrules[msg].alertText;\r\n\t\t\t\t\t\t\t\t\t\tif (txt)\r\n\t\t\t\t\t\t\t\t\t\t\tmsg = txt;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tif(options.showPrompts) methods._showPrompt(errorField, msg, \"\", false, options, true);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\toptions.onAjaxFormComplete(!errorInForm, form, json, options);\r\n\t\t\t\t\t} else\r\n\t\t\t\t\t\toptions.onAjaxFormComplete(true, form, json, options);\r\n\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t},\r\n\t\t/**\r\n\t\t* Validates field, shows prompts accordingly\r\n\t\t*\r\n\t\t* @param {jqObject}\r\n\t\t* field\r\n\t\t* @param {Array[String]}\r\n\t\t* field's validation rules\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @return false if field is valid (It is inversed for *fields*, it return false on validate and true on errors.)\r\n\t\t*/\r\n\t\t_validateField: function(field, options, skipAjaxValidation) {\r\n\t\t\tif (!field.attr(\"id\")) {\r\n\t\t\t\tfield.attr(\"id\", \"form-validation-field-\" + $.validationEngine.fieldIdCounter);\r\n\t\t\t\t++$.validationEngine.fieldIdCounter;\r\n\t\t\t}\r\n\r\n if (!options.validateNonVisibleFields && (field.is(\":hidden\") && !options.prettySelect || field.parent().is(\":hidden\")))\r\n\t\t\t\treturn false;\r\n\r\n\t\t\tvar rulesParsing = field.attr(options.validateAttribute);\r\n\t\t\tvar getRules = /validate\\[(.*)\\]/.exec(rulesParsing);\r\n\r\n\t\t\tif (!getRules)\r\n\t\t\t\treturn false;\r\n\t\t\tvar str = getRules[1];\r\n\t\t\tvar rules = str.split(/\\[|,|\\]/);\r\n\r\n\t\t\t// true if we ran the ajax validation, tells the logic to stop messing with prompts\r\n\t\t\tvar isAjaxValidator = false;\r\n\t\t\tvar fieldName = field.attr(\"name\");\r\n\t\t\tvar promptText = \"\";\r\n\t\t\tvar promptType = \"\";\r\n\t\t\tvar required = false;\r\n\t\t\tvar limitErrors = false;\r\n\t\t\toptions.isError = false;\r\n\t\t\toptions.showArrow = true;\r\n\t\t\t\r\n\t\t\t// If the programmer wants to limit the amount of error messages per field,\r\n\t\t\tif (options.maxErrorsPerField > 0) {\r\n\t\t\t\tlimitErrors = true;\r\n\t\t\t}\r\n\r\n\t\t\tvar form = $(field.closest(\"form, .validationEngineContainer\"));\r\n\t\t\t// Fix for adding spaces in the rules\r\n\t\t\tfor (var i = 0; i < rules.length; i++) {\r\n\t\t\t\trules[i] = rules[i].replace(\" \", \"\");\r\n\t\t\t\t// Remove any parsing errors\r\n\t\t\t\tif (rules[i] === '') {\r\n\t\t\t\t\tdelete rules[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfor (var i = 0, field_errors = 0; i < rules.length; i++) {\r\n\t\t\t\t\r\n\t\t\t\t// If we are limiting errors, and have hit the max, break\r\n\t\t\t\tif (limitErrors && field_errors >= options.maxErrorsPerField) {\r\n\t\t\t\t\t// If we haven't hit a required yet, check to see if there is one in the validation rules for this\r\n\t\t\t\t\t// field and that it's index is greater or equal to our current index\r\n\t\t\t\t\tif (!required) {\r\n\t\t\t\t\t\tvar have_required = $.inArray('required', rules);\r\n\t\t\t\t\t\trequired = (have_required != -1 && have_required >= i);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tvar errorMsg = undefined;\r\n\t\t\t\tswitch (rules[i]) {\r\n\r\n\t\t\t\t\tcase \"required\":\r\n\t\t\t\t\t\trequired = true;\r\n\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._required);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"custom\":\r\n\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._custom);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"groupRequired\":\r\n\t\t\t\t\t\t// Check is its the first of group, if not, reload validation with first field\r\n\t\t\t\t\t\t// AND continue normal validation on present field\r\n\t\t\t\t\t\tvar classGroup = \"[\"+options.validateAttribute+\"*=\" +rules[i + 1] +\"]\";\r\n\t\t\t\t\t\tvar firstOfGroup = form.find(classGroup).eq(0);\r\n\t\t\t\t\t\tif(firstOfGroup[0] != field[0]){\r\n\r\n\t\t\t\t\t\t\tmethods._validateField(firstOfGroup, options, skipAjaxValidation); \r\n\t\t\t\t\t\t\toptions.showArrow = true;\r\n\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._groupRequired);\r\n\t\t\t\t\t\tif(errorMsg) required = true;\r\n\t\t\t\t\t\toptions.showArrow = false;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"ajax\":\r\n\t\t\t\t\t\t// AJAX defaults to returning it's loading message\r\n\t\t\t\t\t\terrorMsg = methods._ajax(field, rules, i, options);\r\n\t\t\t\t\t\tif (errorMsg) {\r\n\t\t\t\t\t\t\tpromptType = \"load\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"minSize\":\r\n\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._minSize);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"maxSize\":\r\n\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._maxSize);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"min\":\r\n\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._min);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"max\":\r\n\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._max);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"past\":\r\n\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field,rules[i], rules, i, options, methods._past);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"future\":\r\n\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field,rules[i], rules, i, options, methods._future);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"dateRange\":\r\n\t\t\t\t\t\tvar classGroup = \"[\"+options.validateAttribute+\"*=\" + rules[i + 1] + \"]\";\r\n\t\t\t\t\t\toptions.firstOfGroup = form.find(classGroup).eq(0);\r\n\t\t\t\t\t\toptions.secondOfGroup = form.find(classGroup).eq(1);\r\n\r\n\t\t\t\t\t\t//if one entry out of the pair has value then proceed to run through validation\r\n\t\t\t\t\t\tif (options.firstOfGroup[0].value || options.secondOfGroup[0].value) {\r\n\t\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field,rules[i], rules, i, options, methods._dateRange);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (errorMsg) required = true;\r\n\t\t\t\t\t\toptions.showArrow = false;\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tcase \"dateTimeRange\":\r\n\t\t\t\t\t\tvar classGroup = \"[\"+options.validateAttribute+\"*=\" + rules[i + 1] + \"]\";\r\n\t\t\t\t\t\toptions.firstOfGroup = form.find(classGroup).eq(0);\r\n\t\t\t\t\t\toptions.secondOfGroup = form.find(classGroup).eq(1);\r\n\r\n\t\t\t\t\t\t//if one entry out of the pair has value then proceed to run through validation\r\n\t\t\t\t\t\tif (options.firstOfGroup[0].value || options.secondOfGroup[0].value) {\r\n\t\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field,rules[i], rules, i, options, methods._dateTimeRange);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (errorMsg) required = true;\r\n\t\t\t\t\t\toptions.showArrow = false;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"maxCheckbox\":\r\n\t\t\t\t\t\tfield = $(form.find(\"input[name='\" + fieldName + \"']\"));\r\n\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._maxCheckbox);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"minCheckbox\":\r\n\t\t\t\t\t\tfield = $(form.find(\"input[name='\" + fieldName + \"']\"));\r\n\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._minCheckbox);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"equals\":\r\n\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._equals);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"funcCall\":\r\n\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._funcCall);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"creditCard\":\r\n\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._creditCard);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"condRequired\":\r\n\t\t\t\t\t\terrorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._condRequired);\r\n\t\t\t\t\t\tif (errorMsg !== undefined) {\r\n\t\t\t\t\t\t\trequired = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tvar end_validation = false;\r\n\t\t\t\t\r\n\t\t\t\t// If we were passed back an message object, check what the status was to determine what to do\r\n\t\t\t\tif (typeof errorMsg == \"object\") {\r\n\t\t\t\t\tswitch (errorMsg.status) {\r\n\t\t\t\t\t\tcase \"_break\":\r\n\t\t\t\t\t\t\tend_validation = true;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t// If we have an error message, set errorMsg to the error message\r\n\t\t\t\t\t\tcase \"_error\":\r\n\t\t\t\t\t\t\terrorMsg = errorMsg.message;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t// If we want to throw an error, but not show a prompt, return early with true\r\n\t\t\t\t\t\tcase \"_error_no_prompt\":\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t// Anything else we continue on\r\n\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// If it has been specified that validation should end now, break\r\n\t\t\t\tif (end_validation) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// If we have a string, that means that we have an error, so add it to the error message.\r\n\t\t\t\tif (typeof errorMsg == 'string') {\r\n\t\t\t\t\tpromptText += errorMsg + \"<br/>\";\r\n\t\t\t\t\toptions.isError = true;\r\n\t\t\t\t\tfield_errors++;\r\n\t\t\t\t}\t\r\n\t\t\t}\r\n\t\t\t// If the rules required is not added, an empty field is not validated\r\n\t\t\t//the 3rd condition is added so that even empty password fields should be equal\r\n\t\t\t//otherwise if one is filled and another left empty, the \"equal\" condition would fail\r\n\t\t\t//which does not make any sense\r\n\t\t\tif(!required && !(field.val()) && field.val().length < 1 && rules.indexOf(\"equals\") < 0) options.isError = false;\r\n\r\n\t\t\t// Hack for radio/checkbox group button, the validation go into the\r\n\t\t\t// first radio/checkbox of the group\r\n\t\t\tvar fieldType = field.prop(\"type\");\r\n\t\t\tvar positionType=field.data(\"promptPosition\") || options.promptPosition;\r\n\r\n\t\t\tif ((fieldType == \"radio\" || fieldType == \"checkbox\") && form.find(\"input[name='\" + fieldName + \"']\").size() > 1) {\r\n\t\t\t\tif(positionType === 'inline') {\r\n\t\t\t\t\tfield = $(form.find(\"input[name='\" + fieldName + \"'][type!=hidden]:last\"));\r\n\t\t\t\t} else {\r\n\t\t\t\tfield = $(form.find(\"input[name='\" + fieldName + \"'][type!=hidden]:first\"));\r\n\t\t\t\t}\r\n\t\t\t\toptions.showArrow = false;\r\n\t\t\t}\r\n\r\n\t\t\tif(field.is(\":hidden\") && options.prettySelect) {\r\n\t\t\t\tfield = form.find(\"#\" + options.usePrefix + methods._jqSelector(field.attr('id')) + options.useSuffix);\r\n\t\t\t}\r\n\r\n\t\t\tif (options.isError && options.showPrompts){\r\n\t\t\t\tmethods._showPrompt(field, promptText, promptType, false, options);\r\n\t\t\t}else{\r\n\t\t\t\tif (!isAjaxValidator) methods._closePrompt(field);\r\n\t\t\t}\r\n\r\n\t\t\tif (!isAjaxValidator) {\r\n\t\t\t\tfield.trigger(\"jqv.field.result\", [field, options.isError, promptText]);\r\n\t\t\t}\r\n\r\n\t\t\t/* Record error */\r\n\t\t\tvar errindex = $.inArray(field[0], options.InvalidFields);\r\n\t\t\tif (errindex == -1) {\r\n\t\t\t\tif (options.isError)\r\n\t\t\t\toptions.InvalidFields.push(field[0]);\r\n\t\t\t} else if (!options.isError) {\r\n\t\t\t\toptions.InvalidFields.splice(errindex, 1);\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\tmethods._handleStatusCssClasses(field, options);\r\n\t\r\n\t\t\t/* run callback function for each field */\r\n\t\t\tif (options.isError && options.onFieldFailure)\r\n\t\t\t\toptions.onFieldFailure(field);\r\n\r\n\t\t\tif (!options.isError && options.onFieldSuccess)\r\n\t\t\t\toptions.onFieldSuccess(field);\r\n\r\n\t\t\treturn options.isError;\r\n\t\t},\r\n\t\t/**\r\n\t\t* Handling css classes of fields indicating result of validation \r\n\t\t*\r\n\t\t* @param {jqObject}\r\n\t\t* field\r\n\t\t* @param {Array[String]}\r\n\t\t* field's validation rules \r\n\t\t* @private\r\n\t\t*/\r\n\t\t_handleStatusCssClasses: function(field, options) {\r\n\t\t\t/* remove all classes */\r\n\t\t\tif(options.addSuccessCssClassToField)\r\n\t\t\t\tfield.removeClass(options.addSuccessCssClassToField);\r\n\t\t\t\r\n\t\t\tif(options.addFailureCssClassToField)\r\n\t\t\t\tfield.removeClass(options.addFailureCssClassToField);\r\n\t\t\t\r\n\t\t\t/* Add classes */\r\n\t\t\tif (options.addSuccessCssClassToField && !options.isError)\r\n\t\t\t\tfield.addClass(options.addSuccessCssClassToField);\r\n\t\t\t\r\n\t\t\tif (options.addFailureCssClassToField && options.isError)\r\n\t\t\t\tfield.addClass(options.addFailureCssClassToField);\t\t\r\n\t\t},\r\n\t\t\r\n\t\t /********************\r\n\t\t * _getErrorMessage\r\n\t\t *\r\n\t\t * @param form\r\n\t\t * @param field\r\n\t\t * @param rule\r\n\t\t * @param rules\r\n\t\t * @param i\r\n\t\t * @param options\r\n\t\t * @param originalValidationMethod\r\n\t\t * @return {*}\r\n\t\t * @private\r\n\t\t */\r\n\t\t _getErrorMessage:function (form, field, rule, rules, i, options, originalValidationMethod) {\r\n\t\t\t // If we are using the custon validation type, build the index for the rule.\r\n\t\t\t // Otherwise if we are doing a function call, make the call and return the object\r\n\t\t\t // that is passed back.\r\n\t \t\t var rule_index = jQuery.inArray(rule, rules);\r\n\t\t\t if (rule === \"custom\" || rule === \"funcCall\") {\r\n\t\t\t\t var custom_validation_type = rules[rule_index + 1];\r\n\t\t\t\t rule = rule + \"[\" + custom_validation_type + \"]\";\r\n\t\t\t\t // Delete the rule from the rules array so that it doesn't try to call the\r\n\t\t\t // same rule over again\r\n\t\t\t delete(rules[rule_index]);\r\n\t\t\t }\r\n\t\t\t // Change the rule to the composite rule, if it was different from the original\r\n\t\t\t var alteredRule = rule;\r\n\r\n\r\n\t\t\t var element_classes = (field.attr(\"data-validation-engine\")) ? field.attr(\"data-validation-engine\") : field.attr(\"class\");\r\n\t\t\t var element_classes_array = element_classes.split(\" \");\r\n\r\n\t\t\t // Call the original validation method. If we are dealing with dates or checkboxes, also pass the form\r\n\t\t\t var errorMsg;\r\n\t\t\t if (rule == \"future\" || rule == \"past\" || rule == \"maxCheckbox\" || rule == \"minCheckbox\") {\r\n\t\t\t\t errorMsg = originalValidationMethod(form, field, rules, i, options);\r\n\t\t\t } else {\r\n\t\t\t\t errorMsg = originalValidationMethod(field, rules, i, options);\r\n\t\t\t }\r\n\r\n\t\t\t // If the original validation method returned an error and we have a custom error message,\r\n\t\t\t // return the custom message instead. Otherwise return the original error message.\r\n\t\t\t if (errorMsg != undefined) {\r\n\t\t\t\t var custom_message = methods._getCustomErrorMessage($(field), element_classes_array, alteredRule, options);\r\n\t\t\t\t if (custom_message) errorMsg = custom_message;\r\n\t\t\t }\r\n\t\t\t return errorMsg;\r\n\r\n\t\t },\r\n\t\t _getCustomErrorMessage:function (field, classes, rule, options) {\r\n\t\t\tvar custom_message = false;\r\n\t\t\tvar validityProp = /^custom\\[.*\\]$/.test(rule) ? methods._validityProp[\"custom\"] : methods._validityProp[rule];\r\n\t\t\t // If there is a validityProp for this rule, check to see if the field has an attribute for it\r\n\t\t\tif (validityProp != undefined) {\r\n\t\t\t\tcustom_message = field.attr(\"data-errormessage-\"+validityProp);\r\n\t\t\t\t// If there was an error message for it, return the message\r\n\t\t\t\tif (custom_message != undefined) \r\n\t\t\t\t\treturn custom_message;\r\n\t\t\t}\r\n\t\t\tcustom_message = field.attr(\"data-errormessage\");\r\n\t\t\t // If there is an inline custom error message, return it\r\n\t\t\tif (custom_message != undefined) \r\n\t\t\t\treturn custom_message;\r\n\t\t\tvar id = '#' + field.attr(\"id\");\r\n\t\t\t// If we have custom messages for the element's id, get the message for the rule from the id.\r\n\t\t\t// Otherwise, if we have custom messages for the element's classes, use the first class message we find instead.\r\n\t\t\tif (typeof options.custom_error_messages[id] != \"undefined\" &&\r\n\t\t\t\ttypeof options.custom_error_messages[id][rule] != \"undefined\" ) {\r\n\t\t\t\t\t\t custom_message = options.custom_error_messages[id][rule]['message'];\r\n\t\t\t} else if (classes.length > 0) {\r\n\t\t\t\tfor (var i = 0; i < classes.length && classes.length > 0; i++) {\r\n\t\t\t\t\t var element_class = \".\" + classes[i];\r\n\t\t\t\t\tif (typeof options.custom_error_messages[element_class] != \"undefined\" &&\r\n\t\t\t\t\t\ttypeof options.custom_error_messages[element_class][rule] != \"undefined\") {\r\n\t\t\t\t\t\t\tcustom_message = options.custom_error_messages[element_class][rule]['message'];\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tif (!custom_message &&\r\n\t\t\t\ttypeof options.custom_error_messages[rule] != \"undefined\" &&\r\n\t\t\t\ttypeof options.custom_error_messages[rule]['message'] != \"undefined\"){\r\n\t\t\t\t\t custom_message = options.custom_error_messages[rule]['message'];\r\n\t\t\t }\r\n\t\t\t return custom_message;\r\n\t\t },\r\n\t\t _validityProp: {\r\n\t\t\t \"required\": \"value-missing\",\r\n\t\t\t \"custom\": \"custom-error\",\r\n\t\t\t \"groupRequired\": \"value-missing\",\r\n\t\t\t \"ajax\": \"custom-error\",\r\n\t\t\t \"minSize\": \"range-underflow\",\r\n\t\t\t \"maxSize\": \"range-overflow\",\r\n\t\t\t \"min\": \"range-underflow\",\r\n\t\t\t \"max\": \"range-overflow\",\r\n\t\t\t \"past\": \"type-mismatch\",\r\n\t\t\t \"future\": \"type-mismatch\",\r\n\t\t\t \"dateRange\": \"type-mismatch\",\r\n\t\t\t \"dateTimeRange\": \"type-mismatch\",\r\n\t\t\t \"maxCheckbox\": \"range-overflow\",\r\n\t\t\t \"minCheckbox\": \"range-underflow\",\r\n\t\t\t \"equals\": \"pattern-mismatch\",\r\n\t\t\t \"funcCall\": \"custom-error\",\r\n\t\t\t \"creditCard\": \"pattern-mismatch\",\r\n\t\t\t \"condRequired\": \"value-missing\"\r\n\t\t },\r\n\t\t/**\r\n\t\t* Required validation\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {Array[String]} rules\r\n\t\t* @param {int} i rules index\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @param {bool} condRequired flag when method is used for internal purpose in condRequired check\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_required: function(field, rules, i, options, condRequired) {\r\n\t\t\tswitch (field.prop(\"type\")) {\r\n\t\t\t\tcase \"text\":\r\n\t\t\t\tcase \"password\":\r\n\t\t\t\tcase \"textarea\":\r\n\t\t\t\tcase \"file\":\r\n\t\t\t\tcase \"select-one\":\r\n\t\t\t\tcase \"select-multiple\":\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tvar field_val = $.trim( field.val() );\r\n\t\t\t\t\tvar dv_placeholder = $.trim( field.attr(\"data-validation-placeholder\") );\r\n\t\t\t\t\tvar placeholder = $.trim( field.attr(\"placeholder\") );\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\t ( !field_val )\r\n\t\t\t\t\t\t|| ( dv_placeholder && field_val == dv_placeholder )\r\n\t\t\t\t\t\t|| ( placeholder && field_val == placeholder )\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\treturn options.allrules[rules[i]].alertText;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"radio\":\r\n\t\t\t\tcase \"checkbox\":\r\n\t\t\t\t\t// new validation style to only check dependent field\r\n\t\t\t\t\tif (condRequired) {\r\n\t\t\t\t\t\tif (!field.attr('checked')) {\r\n\t\t\t\t\t\t\treturn options.allrules[rules[i]].alertTextCheckboxMultiple;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// old validation style\r\n\t\t\t\t\tvar form = field.closest(\"form, .validationEngineContainer\");\r\n\t\t\t\t\tvar name = field.attr(\"name\");\r\n\t\t\t\t\tif (form.find(\"input[name='\" + name + \"']:checked\").size() == 0) {\r\n\t\t\t\t\t\tif (form.find(\"input[name='\" + name + \"']:visible\").size() == 1)\r\n\t\t\t\t\t\t\treturn options.allrules[rules[i]].alertTextCheckboxe;\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\treturn options.allrules[rules[i]].alertTextCheckboxMultiple;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t* Validate that 1 from the group field is required\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {Array[String]} rules\r\n\t\t* @param {int} i rules index\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_groupRequired: function(field, rules, i, options) {\r\n\t\t\tvar classGroup = \"[\"+options.validateAttribute+\"*=\" +rules[i + 1] +\"]\";\r\n\t\t\tvar isValid = false;\r\n\t\t\t// Check all fields from the group\r\n\t\t\tfield.closest(\"form, .validationEngineContainer\").find(classGroup).each(function(){\r\n\t\t\t\tif(!methods._required($(this), rules, i, options)){\r\n\t\t\t\t\tisValid = true;\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}); \r\n\r\n\t\t\tif(!isValid) {\r\n\t\t return options.allrules[rules[i]].alertText;\r\n\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t* Validate rules\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {Array[String]} rules\r\n\t\t* @param {int} i rules index\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_custom: function(field, rules, i, options) {\r\n\t\t\tvar customRule = rules[i + 1];\r\n\t\t\tvar rule = options.allrules[customRule];\r\n\t\t\tvar fn;\r\n\t\t\tif(!rule) {\r\n\t\t\t\talert(\"jqv:custom rule not found - \"+customRule);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif(rule[\"regex\"]) {\r\n\t\t\t\t var ex=rule.regex;\r\n\t\t\t\t\tif(!ex) {\r\n\t\t\t\t\t\talert(\"jqv:custom regex not found - \"+customRule);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar pattern = new RegExp(ex);\r\n\r\n\t\t\t\t\tif (!pattern.test(field.val())) return options.allrules[customRule].alertText;\r\n\t\t\t\t\t\r\n\t\t\t} else if(rule[\"func\"]) {\r\n\t\t\t\tfn = rule[\"func\"]; \r\n\t\t\t\t \r\n\t\t\t\tif (typeof(fn) !== \"function\") {\r\n\t\t\t\t\talert(\"jqv:custom parameter 'function' is no function - \"+customRule);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\t \r\n\t\t\t\tif (!fn(field, rules, i, options))\r\n\t\t\t\t\treturn options.allrules[customRule].alertText;\r\n\t\t\t} else {\r\n\t\t\t\talert(\"jqv:custom type not allowed \"+customRule);\r\n\t\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t* Validate custom function outside of the engine scope\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {Array[String]} rules\r\n\t\t* @param {int} i rules index\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_funcCall: function(field, rules, i, options) {\r\n\t\t\tvar functionName = rules[i + 1];\r\n\t\t\tvar fn;\r\n\t\t\tif(functionName.indexOf('.') >-1)\r\n\t\t\t{\r\n\t\t\t\tvar namespaces = functionName.split('.');\r\n\t\t\t\tvar scope = window;\r\n\t\t\t\twhile(namespaces.length)\r\n\t\t\t\t{\r\n\t\t\t\t\tscope = scope[namespaces.shift()];\r\n\t\t\t\t}\r\n\t\t\t\tfn = scope;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\tfn = window[functionName] || options.customFunctions[functionName];\r\n\t\t\tif (typeof(fn) == 'function')\r\n\t\t\t\treturn fn(field, rules, i, options);\r\n\r\n\t\t},\r\n\t\t/**\r\n\t\t* Field match\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {Array[String]} rules\r\n\t\t* @param {int} i rules index\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_equals: function(field, rules, i, options) {\r\n\t\t\tvar equalsField = rules[i + 1];\r\n\r\n\t\t\tif (field.val() != $(\"#\" + equalsField).val())\r\n\t\t\t\treturn options.allrules.equals.alertText;\r\n\t\t},\r\n\t\t/**\r\n\t\t* Check the maximum size (in characters)\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {Array[String]} rules\r\n\t\t* @param {int} i rules index\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_maxSize: function(field, rules, i, options) {\r\n\t\t\tvar max = rules[i + 1];\r\n\t\t\tvar len = field.val().length;\r\n\r\n\t\t\tif (len > max) {\r\n\t\t\t\tvar rule = options.allrules.maxSize;\r\n\t\t\t\treturn rule.alertText + max + rule.alertText2;\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t* Check the minimum size (in characters)\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {Array[String]} rules\r\n\t\t* @param {int} i rules index\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_minSize: function(field, rules, i, options) {\r\n\t\t\tvar min = rules[i + 1];\r\n\t\t\tvar len = field.val().length;\r\n\r\n\t\t\tif (len < min) {\r\n\t\t\t\tvar rule = options.allrules.minSize;\r\n\t\t\t\treturn rule.alertText + min + rule.alertText2;\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t* Check number minimum value\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {Array[String]} rules\r\n\t\t* @param {int} i rules index\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_min: function(field, rules, i, options) {\r\n\t\t\tvar min = parseFloat(rules[i + 1]);\r\n\t\t\tvar len = parseFloat(field.val());\r\n\r\n\t\t\tif (len < min) {\r\n\t\t\t\tvar rule = options.allrules.min;\r\n\t\t\t\tif (rule.alertText2) return rule.alertText + min + rule.alertText2;\r\n\t\t\t\treturn rule.alertText + min;\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t* Check number maximum value\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {Array[String]} rules\r\n\t\t* @param {int} i rules index\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_max: function(field, rules, i, options) {\r\n\t\t\tvar max = parseFloat(rules[i + 1]);\r\n\t\t\tvar len = parseFloat(field.val());\r\n\r\n\t\t\tif (len >max ) {\r\n\t\t\t\tvar rule = options.allrules.max;\r\n\t\t\t\tif (rule.alertText2) return rule.alertText + max + rule.alertText2;\r\n\t\t\t\t//orefalo: to review, also do the translations\r\n\t\t\t\treturn rule.alertText + max;\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t* Checks date is in the past\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {Array[String]} rules\r\n\t\t* @param {int} i rules index\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_past: function(form, field, rules, i, options) {\r\n\r\n\t\t\tvar p=rules[i + 1];\r\n\t\t\tvar fieldAlt = $(form.find(\"*[name='\" + p.replace(/^#+/, '') + \"']\"));\r\n\t\t\tvar pdate;\r\n\r\n\t\t\tif (p.toLowerCase() == \"now\") {\r\n\t\t\t\tpdate = new Date();\r\n\t\t\t} else if (undefined != fieldAlt.val()) {\r\n\t\t\t\tif (fieldAlt.is(\":disabled\"))\r\n\t\t\t\t\treturn;\r\n\t\t\t\tpdate = methods._parseDate(fieldAlt.val());\r\n\t\t\t} else {\r\n\t\t\t\tpdate = methods._parseDate(p);\r\n\t\t\t}\r\n\t\t\tvar vdate = methods._parseDate(field.val());\r\n\r\n\t\t\tif (vdate > pdate ) {\r\n\t\t\t\tvar rule = options.allrules.past;\r\n\t\t\t\tif (rule.alertText2) return rule.alertText + methods._dateToString(pdate) + rule.alertText2;\r\n\t\t\t\treturn rule.alertText + methods._dateToString(pdate);\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t* Checks date is in the future\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {Array[String]} rules\r\n\t\t* @param {int} i rules index\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_future: function(form, field, rules, i, options) {\r\n\r\n\t\t\tvar p=rules[i + 1];\r\n\t\t\tvar fieldAlt = $(form.find(\"*[name='\" + p.replace(/^#+/, '') + \"']\"));\r\n\t\t\tvar pdate;\r\n\r\n\t\t\tif (p.toLowerCase() == \"now\") {\r\n\t\t\t\tpdate = new Date();\r\n\t\t\t} else if (undefined != fieldAlt.val()) {\r\n\t\t\t\tif (fieldAlt.is(\":disabled\"))\r\n\t\t\t\t\treturn;\r\n\t\t\t\tpdate = methods._parseDate(fieldAlt.val());\r\n\t\t\t} else {\r\n\t\t\t\tpdate = methods._parseDate(p);\r\n\t\t\t}\r\n\t\t\tvar vdate = methods._parseDate(field.val());\r\n\r\n\t\t\tif (vdate < pdate ) {\r\n\t\t\t\tvar rule = options.allrules.future;\r\n\t\t\t\tif (rule.alertText2)\r\n\t\t\t\t\treturn rule.alertText + methods._dateToString(pdate) + rule.alertText2;\r\n\t\t\t\treturn rule.alertText + methods._dateToString(pdate);\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t* Checks if valid date\r\n\t\t*\r\n\t\t* @param {string} date string\r\n\t\t* @return a bool based on determination of valid date\r\n\t\t*/\r\n\t\t_isDate: function (value) {\r\n\t\t\tvar dateRegEx = new RegExp(/^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])$|^(?:(?:(?:0?[13578]|1[02])(\\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\\/|-)(?:29|30)))(\\/|-)(?:[1-9]\\d\\d\\d|\\d[1-9]\\d\\d|\\d\\d[1-9]\\d|\\d\\d\\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\\/|-)(?:0?[1-9]|1\\d|2[0-8]))(\\/|-)(?:[1-9]\\d\\d\\d|\\d[1-9]\\d\\d|\\d\\d[1-9]\\d|\\d\\d\\d[1-9])$|^(0?2(\\/|-)29)(\\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\\d\\d)?(?:0[48]|[2468][048]|[13579][26]))$/);\r\n\t\t\treturn dateRegEx.test(value);\r\n\t\t},\r\n\t\t/**\r\n\t\t* Checks if valid date time\r\n\t\t*\r\n\t\t* @param {string} date string\r\n\t\t* @return a bool based on determination of valid date time\r\n\t\t*/\r\n\t\t_isDateTime: function (value){\r\n\t\t\tvar dateTimeRegEx = new RegExp(/^\\d{4}[\\/\\-](0?[1-9]|1[012])[\\/\\-](0?[1-9]|[12][0-9]|3[01])\\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\\s+(am|pm|AM|PM){1}$|^(?:(?:(?:0?[13578]|1[02])(\\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\\/|-)(?:29|30)))(\\/|-)(?:[1-9]\\d\\d\\d|\\d[1-9]\\d\\d|\\d\\d[1-9]\\d|\\d\\d\\d[1-9])$|^((1[012]|0?[1-9]){1}\\/(0?[1-9]|[12][0-9]|3[01]){1}\\/\\d{2,4}\\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\\s+(am|pm|AM|PM){1})$/);\r\n\t\t\treturn dateTimeRegEx.test(value);\r\n\t\t},\r\n\t\t//Checks if the start date is before the end date\r\n\t\t//returns true if end is later than start\r\n\t\t_dateCompare: function (start, end) {\r\n\t\t\treturn (new Date(start.toString()) < new Date(end.toString()));\r\n\t\t},\r\n\t\t/**\r\n\t\t* Checks date range\r\n\t\t*\r\n\t\t* @param {jqObject} first field name\r\n\t\t* @param {jqObject} second field name\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_dateRange: function (field, rules, i, options) {\r\n\t\t\t//are not both populated\r\n\t\t\tif ((!options.firstOfGroup[0].value && options.secondOfGroup[0].value) || (options.firstOfGroup[0].value && !options.secondOfGroup[0].value)) {\r\n\t\t\t\treturn options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;\r\n\t\t\t}\r\n\r\n\t\t\t//are not both dates\r\n\t\t\tif (!methods._isDate(options.firstOfGroup[0].value) || !methods._isDate(options.secondOfGroup[0].value)) {\r\n\t\t\t\treturn options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;\r\n\t\t\t}\r\n\r\n\t\t\t//are both dates but range is off\r\n\t\t\tif (!methods._dateCompare(options.firstOfGroup[0].value, options.secondOfGroup[0].value)) {\r\n\t\t\t\treturn options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t* Checks date time range\r\n\t\t*\r\n\t\t* @param {jqObject} first field name\r\n\t\t* @param {jqObject} second field name\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_dateTimeRange: function (field, rules, i, options) {\r\n\t\t\t//are not both populated\r\n\t\t\tif ((!options.firstOfGroup[0].value && options.secondOfGroup[0].value) || (options.firstOfGroup[0].value && !options.secondOfGroup[0].value)) {\r\n\t\t\t\treturn options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;\r\n\t\t\t}\r\n\t\t\t//are not both dates\r\n\t\t\tif (!methods._isDateTime(options.firstOfGroup[0].value) || !methods._isDateTime(options.secondOfGroup[0].value)) {\r\n\t\t\t\treturn options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;\r\n\t\t\t}\r\n\t\t\t//are both dates but range is off\r\n\t\t\tif (!methods._dateCompare(options.firstOfGroup[0].value, options.secondOfGroup[0].value)) {\r\n\t\t\t\treturn options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2;\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t* Max number of checkbox selected\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {Array[String]} rules\r\n\t\t* @param {int} i rules index\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_maxCheckbox: function(form, field, rules, i, options) {\r\n\r\n\t\t\tvar nbCheck = rules[i + 1];\r\n\t\t\tvar groupname = field.attr(\"name\");\r\n\t\t\tvar groupSize = form.find(\"input[name='\" + groupname + \"']:checked\").size();\r\n\t\t\tif (groupSize > nbCheck) {\r\n\t\t\t\toptions.showArrow = false;\r\n\t\t\t\tif (options.allrules.maxCheckbox.alertText2)\r\n\t\t\t\t\t return options.allrules.maxCheckbox.alertText + \" \" + nbCheck + \" \" + options.allrules.maxCheckbox.alertText2;\r\n\t\t\t\treturn options.allrules.maxCheckbox.alertText;\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t* Min number of checkbox selected\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {Array[String]} rules\r\n\t\t* @param {int} i rules index\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_minCheckbox: function(form, field, rules, i, options) {\r\n\r\n\t\t\tvar nbCheck = rules[i + 1];\r\n\t\t\tvar groupname = field.attr(\"name\");\r\n\t\t\tvar groupSize = form.find(\"input[name='\" + groupname + \"']:checked\").size();\r\n\t\t\tif (groupSize < nbCheck) {\r\n\t\t\t\toptions.showArrow = false;\r\n\t\t\t\treturn options.allrules.minCheckbox.alertText + \" \" + nbCheck + \" \" + options.allrules.minCheckbox.alertText2;\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t* Checks that it is a valid credit card number according to the\r\n\t\t* Luhn checksum algorithm.\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {Array[String]} rules\r\n\t\t* @param {int} i rules index\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_creditCard: function(field, rules, i, options) {\r\n\t\t\t//spaces and dashes may be valid characters, but must be stripped to calculate the checksum.\r\n\t\t\tvar valid = false, cardNumber = field.val().replace(/ +/g, '').replace(/-+/g, '');\r\n\r\n\t\t\tvar numDigits = cardNumber.length;\r\n\t\t\tif (numDigits >= 14 && numDigits <= 16 && parseInt(cardNumber) > 0) {\r\n\r\n\t\t\t\tvar sum = 0, i = numDigits - 1, pos = 1, digit, luhn = new String();\r\n\t\t\t\tdo {\r\n\t\t\t\t\tdigit = parseInt(cardNumber.charAt(i));\r\n\t\t\t\t\tluhn += (pos++ % 2 == 0) ? digit * 2 : digit;\r\n\t\t\t\t} while (--i >= 0)\r\n\r\n\t\t\t\tfor (i = 0; i < luhn.length; i++) {\r\n\t\t\t\t\tsum += parseInt(luhn.charAt(i));\r\n\t\t\t\t}\r\n\t\t\t\tvalid = sum % 10 == 0;\r\n\t\t\t}\r\n\t\t\tif (!valid) return options.allrules.creditCard.alertText;\r\n\t\t},\r\n\t\t/**\r\n\t\t* Ajax field validation\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {Array[String]} rules\r\n\t\t* @param {int} i rules index\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @return nothing! the ajax validator handles the prompts itself\r\n\t\t*/\r\n\t\t _ajax: function(field, rules, i, options) {\r\n\r\n\t\t\t var errorSelector = rules[i + 1];\r\n\t\t\t var rule = options.allrules[errorSelector];\r\n\t\t\t var extraData = rule.extraData;\r\n\t\t\t var extraDataDynamic = rule.extraDataDynamic;\r\n\t\t\t var data = {\r\n\t\t\t\t\"fieldId\" : field.attr(\"id\"),\r\n\t\t\t\t\"fieldValue\" : field.val()\r\n\t\t\t };\r\n\r\n\t\t\t if (typeof extraData === \"object\") {\r\n\t\t\t\t$.extend(data, extraData);\r\n\t\t\t } else if (typeof extraData === \"string\") {\r\n\t\t\t\tvar tempData = extraData.split(\"&\");\r\n\t\t\t\tfor(var i = 0; i < tempData.length; i++) {\r\n\t\t\t\t\tvar values = tempData[i].split(\"=\");\r\n\t\t\t\t\tif (values[0] && values[0]) {\r\n\t\t\t\t\t\tdata[values[0]] = values[1];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t }\r\n\r\n\t\t\t if (extraDataDynamic) {\r\n\t\t\t\t var tmpData = [];\r\n\t\t\t\t var domIds = String(extraDataDynamic).split(\",\");\r\n\t\t\t\t for (var i = 0; i < domIds.length; i++) {\r\n\t\t\t\t\t var id = domIds[i];\r\n\t\t\t\t\t if ($(id).length) {\r\n\t\t\t\t\t\t var inputValue = field.closest(\"form, .validationEngineContainer\").find(id).val();\r\n\t\t\t\t\t\t var keyValue = id.replace('#', '') + '=' + escape(inputValue);\r\n\t\t\t\t\t\t data[id.replace('#', '')] = inputValue;\r\n\t\t\t\t\t }\r\n\t\t\t\t }\r\n\t\t\t }\r\n\t\t\t \r\n\t\t\t // If a field change event triggered this we want to clear the cache for this ID\r\n\t\t\t if (options.eventTrigger == \"field\") {\r\n\t\t\t\tdelete(options.ajaxValidCache[field.attr(\"id\")]);\r\n\t\t\t }\r\n\r\n\t\t\t // If there is an error or if the the field is already validated, do not re-execute AJAX\r\n\t\t\t if (!options.isError && !methods._checkAjaxFieldStatus(field.attr(\"id\"), options)) {\r\n\t\t\t\t $.ajax({\r\n\t\t\t\t\t type: options.ajaxFormValidationMethod,\r\n\t\t\t\t\t url: rule.url,\r\n\t\t\t\t\t cache: false,\r\n\t\t\t\t\t dataType: \"json\",\r\n\t\t\t\t\t data: data,\r\n\t\t\t\t\t field: field,\r\n\t\t\t\t\t rule: rule,\r\n\t\t\t\t\t methods: methods,\r\n\t\t\t\t\t options: options,\r\n\t\t\t\t\t beforeSend: function() {},\r\n\t\t\t\t\t error: function(data, transport) {\r\n\t\t\t\t\t\tif (options.onFailure) {\r\n\t\t\t\t\t\t\toptions.onFailure(data, transport);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tmethods._ajaxError(data, transport);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t },\r\n\t\t\t\t\t success: function(json) {\r\n\r\n\t\t\t\t\t\t // asynchronously called on success, data is the json answer from the server\r\n\t\t\t\t\t\t var errorFieldId = json[0];\r\n\t\t\t\t\t\t //var errorField = $($(\"#\" + errorFieldId)[0]);\r\n\t\t\t\t\t\t var errorField = $(\"#\"+ errorFieldId).eq(0);\r\n\r\n\t\t\t\t\t\t // make sure we found the element\r\n\t\t\t\t\t\t if (errorField.length == 1) {\r\n\t\t\t\t\t\t\t var status = json[1];\r\n\t\t\t\t\t\t\t // read the optional msg from the server\r\n\t\t\t\t\t\t\t var msg = json[2];\r\n\t\t\t\t\t\t\t if (!status) {\r\n\t\t\t\t\t\t\t\t // Houston we got a problem - display an red prompt\r\n\t\t\t\t\t\t\t\t options.ajaxValidCache[errorFieldId] = false;\r\n\t\t\t\t\t\t\t\t options.isError = true;\r\n\r\n\t\t\t\t\t\t\t\t // resolve the msg prompt\r\n\t\t\t\t\t\t\t\t if(msg) {\r\n\t\t\t\t\t\t\t\t\t if (options.allrules[msg]) {\r\n\t\t\t\t\t\t\t\t\t\t var txt = options.allrules[msg].alertText;\r\n\t\t\t\t\t\t\t\t\t\t if (txt) {\r\n\t\t\t\t\t\t\t\t\t\t\tmsg = txt;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t }\r\n\t\t\t\t\t\t\t\t }\r\n\t\t\t\t\t\t\t\t else\r\n\t\t\t\t\t\t\t\t\tmsg = rule.alertText;\r\n\r\n\t\t\t\t\t\t\t\t if (options.showPrompts) methods._showPrompt(errorField, msg, \"\", true, options);\r\n\t\t\t\t\t\t\t } else {\r\n\t\t\t\t\t\t\t\t options.ajaxValidCache[errorFieldId] = true;\r\n\r\n\t\t\t\t\t\t\t\t // resolves the msg prompt\r\n\t\t\t\t\t\t\t\t if(msg) {\r\n\t\t\t\t\t\t\t\t\t if (options.allrules[msg]) {\r\n\t\t\t\t\t\t\t\t\t\t var txt = options.allrules[msg].alertTextOk;\r\n\t\t\t\t\t\t\t\t\t\t if (txt) {\r\n\t\t\t\t\t\t\t\t\t\t\tmsg = txt;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t }\r\n\t\t\t\t\t\t\t\t }\r\n\t\t\t\t\t\t\t\t else\r\n\t\t\t\t\t\t\t\t msg = rule.alertTextOk;\r\n\r\n\t\t\t\t\t\t\t\t if (options.showPrompts) {\r\n\t\t\t\t\t\t\t\t\t // see if we should display a green prompt\r\n\t\t\t\t\t\t\t\t\t if (msg)\r\n\t\t\t\t\t\t\t\t\t\tmethods._showPrompt(errorField, msg, \"pass\", true, options);\r\n\t\t\t\t\t\t\t\t\t else\r\n\t\t\t\t\t\t\t\t\t\tmethods._closePrompt(errorField);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t // If a submit form triggered this, we want to re-submit the form\r\n\t\t\t\t\t\t\t\t if (options.eventTrigger == \"submit\")\r\n\t\t\t\t\t\t\t\t\tfield.closest(\"form\").submit();\r\n\t\t\t\t\t\t\t }\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t errorField.trigger(\"jqv.field.result\", [errorField, options.isError, msg]);\r\n\t\t\t\t\t }\r\n\t\t\t\t });\r\n\t\t\t\t \r\n\t\t\t\t return rule.alertTextLoad;\r\n\t\t\t }\r\n\t\t },\r\n\t\t/**\r\n\t\t* Common method to handle ajax errors\r\n\t\t*\r\n\t\t* @param {Object} data\r\n\t\t* @param {Object} transport\r\n\t\t*/\r\n\t\t_ajaxError: function(data, transport) {\r\n\t\t\tif(data.status == 0 && transport == null)\r\n\t\t\t\talert(\"The page is not served from a server! ajax call failed\");\r\n\t\t\telse if(typeof console != \"undefined\")\r\n\t\t\t\tconsole.log(\"Ajax error: \" + data.status + \" \" + transport);\r\n\t\t},\r\n\t\t/**\r\n\t\t* date -> string\r\n\t\t*\r\n\t\t* @param {Object} date\r\n\t\t*/\r\n\t\t_dateToString: function(date) {\r\n\t\t\treturn date.getFullYear()+\"-\"+(date.getMonth()+1)+\"-\"+date.getDate();\r\n\t\t},\r\n\t\t/**\r\n\t\t* Parses an ISO date\r\n\t\t* @param {String} d\r\n\t\t*/\r\n\t\t_parseDate: function(d) {\r\n\r\n\t\t\tvar dateParts = d.split(\"-\");\r\n\t\t\tif(dateParts==d)\r\n\t\t\t\tdateParts = d.split(\"/\");\r\n\t\t\tif(dateParts==d) {\r\n\t\t\t\tdateParts = d.split(\".\");\r\n\t\t\t\treturn new Date(dateParts[2], (dateParts[1] - 1), dateParts[0]);\r\n\t\t\t}\r\n\t\t\treturn new Date(dateParts[0], (dateParts[1] - 1) ,dateParts[2]);\r\n\t\t},\r\n\t\t/**\r\n\t\t* Builds or updates a prompt with the given information\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {String} promptText html text to display type\r\n\t\t* @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)\r\n\t\t* @param {boolean} ajaxed - use to mark fields than being validated with ajax\r\n\t\t* @param {Map} options user options\r\n\t\t*/\r\n\t\t _showPrompt: function(field, promptText, type, ajaxed, options, ajaxform) {\r\n\t\t \t//Check if we need to adjust what element to show the prompt on\r\n\t\t\tif(field.data('jqv-prompt-at') instanceof jQuery ){\r\n\t\t\t\tfield = field.data('jqv-prompt-at');\r\n\t\t\t} else if(field.data('jqv-prompt-at')) {\r\n\t\t\t\tfield = $(field.data('jqv-prompt-at'));\r\n\t\t\t}\r\n\r\n\t\t\t var prompt = methods._getPrompt(field);\r\n\t\t\t // The ajax submit errors are not see has an error in the form,\r\n\t\t\t // When the form errors are returned, the engine see 2 bubbles, but those are ebing closed by the engine at the same time\r\n\t\t\t // Because no error was found befor submitting\r\n\t\t\t if(ajaxform) prompt = false;\r\n\t\t\t // Check that there is indded text\r\n\t\t\t if($.trim(promptText)){ \r\n\t\t\t\t if (prompt)\r\n\t\t\t\t\tmethods._updatePrompt(field, prompt, promptText, type, ajaxed, options);\r\n\t\t\t\t else\r\n\t\t\t\t\tmethods._buildPrompt(field, promptText, type, ajaxed, options);\r\n\t\t\t}\r\n\t\t },\r\n\t\t/**\r\n\t\t* Builds and shades a prompt for the given field.\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {String} promptText html text to display type\r\n\t\t* @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)\r\n\t\t* @param {boolean} ajaxed - use to mark fields than being validated with ajax\r\n\t\t* @param {Map} options user options\r\n\t\t*/\r\n\t\t_buildPrompt: function(field, promptText, type, ajaxed, options) {\r\n\r\n\t\t\t// create the prompt\r\n\t\t\tvar prompt = $('<div>');\r\n\t\t\tprompt.addClass(methods._getClassName(field.attr(\"id\")) + \"formError\");\r\n\t\t\t// add a class name to identify the parent form of the prompt\r\n\t\t\tprompt.addClass(\"parentForm\"+methods._getClassName(field.closest('form, .validationEngineContainer').attr(\"id\")));\r\n\t\t\tprompt.addClass(\"formError\");\r\n\r\n\t\t\tswitch (type) {\r\n\t\t\t\tcase \"pass\":\r\n\t\t\t\t\tprompt.addClass(\"greenPopup\");\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"load\":\r\n\t\t\t\t\tprompt.addClass(\"blackPopup\");\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\t/* it has error */\r\n\t\t\t\t\t//alert(\"unknown popup type:\"+type);\r\n\t\t\t}\r\n\t\t\tif (ajaxed)\r\n\t\t\t\tprompt.addClass(\"ajaxed\");\r\n\r\n\t\t\t// create the prompt content\r\n\t\t\tvar promptContent = $('<div>').addClass(\"formErrorContent\").html(promptText).appendTo(prompt);\r\n\r\n\t\t\t// determine position type\r\n\t\t\tvar positionType=field.data(\"promptPosition\") || options.promptPosition;\r\n\r\n\t\t\t// create the css arrow pointing at the field\r\n\t\t\t// note that there is no triangle on max-checkbox and radio\r\n\t\t\tif (options.showArrow) {\r\n\t\t\t\tvar arrow = $('<div>').addClass(\"formErrorArrow\");\r\n\r\n\t\t\t\t//prompt positioning adjustment support. Usage: positionType:Xshift,Yshift (for ex.: bottomLeft:+20 or bottomLeft:-20,+10)\r\n\t\t\t\tif (typeof(positionType)=='string') \r\n\t\t\t\t{\r\n\t\t\t\t\tvar pos=positionType.indexOf(\":\");\r\n\t\t\t\t\tif(pos!=-1)\r\n\t\t\t\t\t\tpositionType=positionType.substring(0,pos);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tswitch (positionType) {\r\n\t\t\t\t\tcase \"bottomLeft\":\r\n\t\t\t\t\tcase \"bottomRight\":\r\n\t\t\t\t\t\tprompt.find(\".formErrorContent\").before(arrow);\r\n\t\t\t\t\t\tarrow.addClass(\"formErrorArrowBottom\").html('<div class=\"line1\"><!-- --></div><div class=\"line2\"><!-- --></div><div class=\"line3\"><!-- --></div><div class=\"line4\"><!-- --></div><div class=\"line5\"><!-- --></div><div class=\"line6\"><!-- --></div><div class=\"line7\"><!-- --></div><div class=\"line8\"><!-- --></div><div class=\"line9\"><!-- --></div><div class=\"line10\"><!-- --></div>');\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"topLeft\":\r\n\t\t\t\t\tcase \"topRight\":\r\n\t\t\t\t\t\tarrow.html('<div class=\"line10\"><!-- --></div><div class=\"line9\"><!-- --></div><div class=\"line8\"><!-- --></div><div class=\"line7\"><!-- --></div><div class=\"line6\"><!-- --></div><div class=\"line5\"><!-- --></div><div class=\"line4\"><!-- --></div><div class=\"line3\"><!-- --></div><div class=\"line2\"><!-- --></div><div class=\"line1\"><!-- --></div>');\r\n\t\t\t\t\t\tprompt.append(arrow);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// Add custom prompt class\r\n\t\t\tif (options.addPromptClass)\r\n\t\t\t\tprompt.addClass(options.addPromptClass);\r\n\r\n // Add custom prompt class defined in element\r\n var requiredOverride = field.attr('data-required-class');\r\n if(requiredOverride !== undefined) {\r\n prompt.addClass(requiredOverride);\r\n } else {\r\n if(options.prettySelect) {\r\n if($('#' + field.attr('id')).next().is('select')) {\r\n var prettyOverrideClass = $('#' + field.attr('id').substr(options.usePrefix.length).substring(options.useSuffix.length)).attr('data-required-class');\r\n if(prettyOverrideClass !== undefined) {\r\n prompt.addClass(prettyOverrideClass);\r\n }\r\n }\r\n }\r\n }\r\n\r\n\t\t\tprompt.css({\r\n\t\t\t\t\"opacity\": 0\r\n\t\t\t});\r\n\t\t\tif(positionType === 'inline') {\r\n\t\t\t\tprompt.addClass(\"inline\");\r\n\t\t\t\tif(typeof field.attr('data-prompt-target') !== 'undefined' && $('#'+field.attr('data-prompt-target')).length > 0) {\r\n\t\t\t\t\tprompt.appendTo($('#'+field.attr('data-prompt-target')));\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfield.after(prompt);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfield.before(prompt);\t\t\t\t\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tvar pos = methods._calculatePosition(field, prompt, options);\r\n\t\t\tprompt.css({\r\n\t\t\t\t'position': positionType === 'inline' ? 'relative' : 'absolute',\r\n\t\t\t\t\"top\": pos.callerTopPosition,\r\n\t\t\t\t\"left\": pos.callerleftPosition,\r\n\t\t\t\t\"marginTop\": pos.marginTopSize,\r\n\t\t\t\t\"opacity\": 0\r\n\t\t\t}).data(\"callerField\", field);\r\n\t\t\t\r\n\r\n\t\t\tif (options.autoHidePrompt) {\r\n\t\t\t\tsetTimeout(function(){\r\n\t\t\t\t\tprompt.animate({\r\n\t\t\t\t\t\t\"opacity\": 0\r\n\t\t\t\t\t},function(){\r\n\t\t\t\t\t\tprompt.closest('.formErrorOuter').remove();\r\n\t\t\t\t\t\tprompt.remove();\r\n\t\t\t\t\t});\r\n\t\t\t\t}, options.autoHideDelay);\r\n\t\t\t} \r\n\t\t\treturn prompt.animate({\r\n\t\t\t\t\"opacity\": 1\r\n\t\t\t});\r\n\t\t},\r\n\t\t/**\r\n\t\t* Updates the prompt text field - the field for which the prompt\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {String} promptText html text to display type\r\n\t\t* @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)\r\n\t\t* @param {boolean} ajaxed - use to mark fields than being validated with ajax\r\n\t\t* @param {Map} options user options\r\n\t\t*/\r\n\t\t_updatePrompt: function(field, prompt, promptText, type, ajaxed, options, noAnimation) {\r\n\r\n\t\t\tif (prompt) {\r\n\t\t\t\tif (typeof type !== \"undefined\") {\r\n\t\t\t\t\tif (type == \"pass\")\r\n\t\t\t\t\t\tprompt.addClass(\"greenPopup\");\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tprompt.removeClass(\"greenPopup\");\r\n\r\n\t\t\t\t\tif (type == \"load\")\r\n\t\t\t\t\t\tprompt.addClass(\"blackPopup\");\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tprompt.removeClass(\"blackPopup\");\r\n\t\t\t\t}\r\n\t\t\t\tif (ajaxed)\r\n\t\t\t\t\tprompt.addClass(\"ajaxed\");\r\n\t\t\t\telse\r\n\t\t\t\t\tprompt.removeClass(\"ajaxed\");\r\n\r\n\t\t\t\tprompt.find(\".formErrorContent\").html(promptText);\r\n\r\n\t\t\t\tvar pos = methods._calculatePosition(field, prompt, options);\r\n\t\t\t\tvar css = {\"top\": pos.callerTopPosition,\r\n\t\t\t\t\"left\": pos.callerleftPosition,\r\n\t\t\t\t\"marginTop\": pos.marginTopSize};\r\n\r\n\t\t\t\tif (noAnimation)\r\n\t\t\t\t\tprompt.css(css);\r\n\t\t\t\telse\r\n\t\t\t\t\tprompt.animate(css);\r\n\t\t\t}\r\n\t\t},\r\n\t\t/**\r\n\t\t* Closes the prompt associated with the given field\r\n\t\t*\r\n\t\t* @param {jqObject}\r\n\t\t* field\r\n\t\t*/\r\n\t\t _closePrompt: function(field) {\r\n\t\t\t var prompt = methods._getPrompt(field);\r\n\t\t\t if (prompt)\r\n\t\t\t\t prompt.fadeTo(\"fast\", 0, function() {\r\n\t\t\t\t\t prompt.parent('.formErrorOuter').remove();\r\n\t\t\t\t\t prompt.remove();\r\n\t\t\t\t });\r\n\t\t },\r\n\t\t closePrompt: function(field) {\r\n\t\t\t return methods._closePrompt(field);\r\n\t\t },\r\n\t\t/**\r\n\t\t* Returns the error prompt matching the field if any\r\n\t\t*\r\n\t\t* @param {jqObject}\r\n\t\t* field\r\n\t\t* @return undefined or the error prompt (jqObject)\r\n\t\t*/\r\n\t\t_getPrompt: function(field) {\r\n\t\t\t\tvar formId = $(field).closest('form, .validationEngineContainer').attr('id');\r\n\t\t\tvar className = methods._getClassName(field.attr(\"id\")) + \"formError\";\r\n\t\t\t\tvar match = $(\".\" + methods._escapeExpression(className) + '.parentForm' + methods._getClassName(formId))[0];\r\n\t\t\tif (match)\r\n\t\t\treturn $(match);\r\n\t\t},\r\n\t\t/**\r\n\t\t * Returns the escapade classname\r\n\t\t *\r\n\t\t * @param {selector}\r\n\t\t * className\r\n\t\t */\r\n\t\t _escapeExpression: function (selector) {\r\n\t\t\t return selector.replace(/([#;&,\\.\\+\\*\\~':\"\\!\\^$\\[\\]\\(\\)=>\\|])/g, \"\\\\$1\");\r\n\t\t },\r\n\t\t/**\r\n\t\t * returns true if we are in a RTLed document\r\n\t\t *\r\n\t\t * @param {jqObject} field\r\n\t\t */\r\n\t\tisRTL: function(field)\r\n\t\t{\r\n\t\t\tvar $document = $(document);\r\n\t\t\tvar $body = $('body');\r\n\t\t\tvar rtl =\r\n\t\t\t\t(field && field.hasClass('rtl')) ||\r\n\t\t\t\t(field && (field.attr('dir') || '').toLowerCase()==='rtl') ||\r\n\t\t\t\t$document.hasClass('rtl') ||\r\n\t\t\t\t($document.attr('dir') || '').toLowerCase()==='rtl' ||\r\n\t\t\t\t$body.hasClass('rtl') ||\r\n\t\t\t\t($body.attr('dir') || '').toLowerCase()==='rtl';\r\n\t\t\treturn Boolean(rtl);\r\n\t\t},\r\n\t\t/**\r\n\t\t* Calculates prompt position\r\n\t\t*\r\n\t\t* @param {jqObject}\r\n\t\t* field\r\n\t\t* @param {jqObject}\r\n\t\t* the prompt\r\n\t\t* @param {Map}\r\n\t\t* options\r\n\t\t* @return positions\r\n\t\t*/\r\n\t\t_calculatePosition: function (field, promptElmt, options) {\r\n\r\n\t\t\tvar promptTopPosition, promptleftPosition, marginTopSize;\r\n\t\t\tvar fieldWidth \t= field.width();\r\n\t\t\tvar fieldLeft \t= field.position().left; \r\n\t\t\tvar fieldTop \t= field.position().top;\r\n\t\t\tvar fieldHeight \t= field.height();\t\r\n\t\t\tvar promptHeight = promptElmt.height();\r\n\r\n\r\n\t\t\t// is the form contained in an overflown container?\r\n\t\t\tpromptTopPosition = promptleftPosition = 0;\r\n\t\t\t// compensation for the arrow\r\n\t\t\tmarginTopSize = -promptHeight;\r\n\t\t\r\n\r\n\t\t\t//prompt positioning adjustment support\r\n\t\t\t//now you can adjust prompt position\r\n\t\t\t//usage: positionType:Xshift,Yshift\r\n\t\t\t//for example:\r\n\t\t\t// bottomLeft:+20 means bottomLeft position shifted by 20 pixels right horizontally\r\n\t\t\t// topRight:20, -15 means topRight position shifted by 20 pixels to right and 15 pixels to top\r\n\t\t\t//You can use +pixels, - pixels. If no sign is provided than + is default.\r\n\t\t\tvar positionType=field.data(\"promptPosition\") || options.promptPosition;\r\n\t\t\tvar shift1=\"\";\r\n\t\t\tvar shift2=\"\";\r\n\t\t\tvar shiftX=0;\r\n\t\t\tvar shiftY=0;\r\n\t\t\tif (typeof(positionType)=='string') {\r\n\t\t\t\t//do we have any position adjustments ?\r\n\t\t\t\tif (positionType.indexOf(\":\")!=-1) {\r\n\t\t\t\t\tshift1=positionType.substring(positionType.indexOf(\":\")+1);\r\n\t\t\t\t\tpositionType=positionType.substring(0,positionType.indexOf(\":\"));\r\n\r\n\t\t\t\t\t//if any advanced positioning will be needed (percents or something else) - parser should be added here\r\n\t\t\t\t\t//for now we use simple parseInt()\r\n\r\n\t\t\t\t\t//do we have second parameter?\r\n\t\t\t\t\tif (shift1.indexOf(\",\") !=-1) {\r\n\t\t\t\t\t\tshift2=shift1.substring(shift1.indexOf(\",\") +1);\r\n\t\t\t\t\t\tshift1=shift1.substring(0,shift1.indexOf(\",\"));\r\n\t\t\t\t\t\tshiftY=parseInt(shift2);\r\n\t\t\t\t\t\tif (isNaN(shiftY)) shiftY=0;\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tshiftX=parseInt(shift1);\r\n\t\t\t\t\tif (isNaN(shift1)) shift1=0;\r\n\r\n\t\t\t\t};\r\n\t\t\t};\r\n\r\n\t\t\t\r\n\t\t\tswitch (positionType) {\r\n\t\t\t\tdefault:\r\n\t\t\t\tcase \"topRight\":\r\n\t\t\t\t\tpromptleftPosition += fieldLeft + fieldWidth - 30;\r\n\t\t\t\t\tpromptTopPosition += fieldTop;\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"topLeft\":\r\n\t\t\t\t\tpromptTopPosition += fieldTop;\r\n\t\t\t\t\tpromptleftPosition += fieldLeft; \r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"centerRight\":\r\n\t\t\t\t\tpromptTopPosition = fieldTop+4;\r\n\t\t\t\t\tmarginTopSize = 0;\r\n\t\t\t\t\tpromptleftPosition= fieldLeft + field.outerWidth(true)+5;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"centerLeft\":\r\n\t\t\t\t\tpromptleftPosition = fieldLeft - (promptElmt.width() + 2);\r\n\t\t\t\t\tpromptTopPosition = fieldTop+4;\r\n\t\t\t\t\tmarginTopSize = 0;\r\n\t\t\t\t\t\r\n\t\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase \"bottomLeft\":\r\n\t\t\t\t\tpromptTopPosition = fieldTop + field.height() + 5;\r\n\t\t\t\t\tmarginTopSize = 0;\r\n\t\t\t\t\tpromptleftPosition = fieldLeft;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"bottomRight\":\r\n\t\t\t\t\tpromptleftPosition = fieldLeft + fieldWidth - 30;\r\n\t\t\t\t\tpromptTopPosition = fieldTop + field.height() + 5;\r\n\t\t\t\t\tmarginTopSize = 0;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"inline\":\r\n\t\t\t\t\tpromptleftPosition = 0;\r\n\t\t\t\t\tpromptTopPosition = 0;\r\n\t\t\t\t\tmarginTopSize = 0;\r\n\t\t\t};\r\n\r\n\t\t\r\n\r\n\t\t\t//apply adjusments if any\r\n\t\t\tpromptleftPosition += shiftX;\r\n\t\t\tpromptTopPosition += shiftY;\r\n\r\n\t\t\treturn {\r\n\t\t\t\t\"callerTopPosition\": promptTopPosition + \"px\",\r\n\t\t\t\t\"callerleftPosition\": promptleftPosition + \"px\",\r\n\t\t\t\t\"marginTopSize\": marginTopSize + \"px\"\r\n\t\t\t};\r\n\t\t},\r\n\t\t/**\r\n\t\t* Saves the user options and variables in the form.data\r\n\t\t*\r\n\t\t* @param {jqObject}\r\n\t\t* form - the form where the user option should be saved\r\n\t\t* @param {Map}\r\n\t\t* options - the user options\r\n\t\t* @return the user options (extended from the defaults)\r\n\t\t*/\r\n\t\t _saveOptions: function(form, options) {\r\n\r\n\t\t\t // is there a language localisation ?\r\n\t\t\t if ($.validationEngineLanguage)\r\n\t\t\t var allRules = $.validationEngineLanguage.allRules;\r\n\t\t\t else\r\n\t\t\t $.error(\"jQuery.validationEngine rules are not loaded, plz add localization files to the page\");\r\n\t\t\t // --- Internals DO NOT TOUCH or OVERLOAD ---\r\n\t\t\t // validation rules and i18\r\n\t\t\t $.validationEngine.defaults.allrules = allRules;\r\n\r\n\t\t\t var userOptions = $.extend(true,{},$.validationEngine.defaults,options);\r\n\r\n\t\t\t form.data('jqv', userOptions);\r\n\t\t\t return userOptions;\r\n\t\t },\r\n\r\n\t\t /**\r\n\t\t * Removes forbidden characters from class name\r\n\t\t * @param {String} className\r\n\t\t */\r\n\t\t _getClassName: function(className) {\r\n\t\t\t if(className)\r\n\t\t\t\t return className.replace(/:/g, \"_\").replace(/\\./g, \"_\");\r\n\t\t\t\t\t },\r\n\t\t/**\r\n\t\t * Escape special character for jQuery selector\r\n\t\t * http://totaldev.com/content/escaping-characters-get-valid-jquery-id\r\n\t\t * @param {String} selector\r\n\t\t */\r\n\t\t _jqSelector: function(str){\r\n\t\t\treturn str.replace(/([;&,\\.\\+\\*\\~':\"\\!\\^#$%@\\[\\]\\(\\)=>\\|])/g, '\\\\$1');\r\n\t\t},\r\n\t\t/**\r\n\t\t* Conditionally required field\r\n\t\t*\r\n\t\t* @param {jqObject} field\r\n\t\t* @param {Array[String]} rules\r\n\t\t* @param {int} i rules index\r\n\t\t* @param {Map}\r\n\t\t* user options\r\n\t\t* @return an error string if validation failed\r\n\t\t*/\r\n\t\t_condRequired: function(field, rules, i, options) {\r\n\t\t\tvar idx, dependingField;\r\n\r\n\t\t\tfor(idx = (i + 1); idx < rules.length; idx++) {\r\n\t\t\t\tdependingField = jQuery(\"#\" + rules[idx]).first();\r\n\r\n\t\t\t\t/* Use _required for determining wether dependingField has a value.\r\n\t\t\t\t * There is logic there for handling all field types, and default value; so we won't replicate that here\r\n\t\t\t\t * Indicate this special use by setting the last parameter to true so we only validate the dependingField on chackboxes and radio buttons (#462)\r\n\t\t\t\t */\r\n\t\t\t\tif (dependingField.length && methods._required(dependingField, [\"required\"], 0, options, true) == undefined) {\r\n\t\t\t\t\t/* We now know any of the depending fields has a value,\r\n\t\t\t\t\t * so we can validate this field as per normal required code\r\n\t\t\t\t\t */\r\n\t\t\t\t\treturn methods._required(field, [\"required\"], 0, options);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t _submitButtonClick: function(event) {\r\n\t var button = $(this);\r\n\t var form = button.closest('form, .validationEngineContainer');\r\n\t form.data(\"jqv_submitButton\", button.attr(\"id\"));\r\n\t }\r\n\t\t };\r\n\r\n\t /**\r\n\t * Plugin entry point.\r\n\t * You may pass an action as a parameter or a list of options.\r\n\t * if none, the init and attach methods are being called.\r\n\t * Remember: if you pass options, the attached method is NOT called automatically\r\n\t *\r\n\t * @param {String}\r\n\t * method (optional) action\r\n\t */\r\n\t $.fn.validationEngine = function(method) {\r\n\r\n\t\t var form = $(this);\r\n\t\t if(!form[0]) return form; // stop here if the form does not exist\r\n\r\n\t\t if (typeof(method) == 'string' && method.charAt(0) != '_' && methods[method]) {\r\n\r\n\t\t\t // make sure init is called once\r\n\t\t\t if(method != \"showPrompt\" && method != \"hide\" && method != \"hideAll\")\r\n\t\t\t methods.init.apply(form);\r\n\r\n\t\t\t return methods[method].apply(form, Array.prototype.slice.call(arguments, 1));\r\n\t\t } else if (typeof method == 'object' || !method) {\r\n\r\n\t\t\t // default constructor with or without arguments\r\n\t\t\t methods.init.apply(form, arguments);\r\n\t\t\t return methods.attach.apply(form);\r\n\t\t } else {\r\n\t\t\t $.error('Method ' + method + ' does not exist in jQuery.validationEngine');\r\n\t\t }\r\n\t};\r\n\r\n\r\n\r\n\t// LEAK GLOBAL OPTIONS\r\n\t$.validationEngine= {fieldIdCounter: 0,defaults:{\r\n\r\n\t\t// Name of the event triggering field validation\r\n\t\tvalidationEventTrigger: \"blur\",\r\n\t\t// Automatically scroll viewport to the first error\r\n\t\tscroll: true,\r\n\t\t// Focus on the first input\r\n\t\tfocusFirstField:true,\r\n\t\t// Show prompts, set to false to disable prompts\r\n\t\tshowPrompts: true,\r\n // Should we attempt to validate non-visible input fields contained in the form? (Useful in cases of tabbed containers, e.g. jQuery-UI tabs)\r\n validateNonVisibleFields: false,\r\n\t\t// Opening box position, possible locations are: topLeft,\r\n\t\t// topRight, bottomLeft, centerRight, bottomRight, inline\r\n\t\t// inline gets inserted after the validated field or into an element specified in data-prompt-target\r\n\t\tpromptPosition: \"topRight\",\r\n\t\tbindMethod:\"bind\",\r\n\t\t// internal, automatically set to true when it parse a _ajax rule\r\n\t\tinlineAjax: false,\r\n\t\t// if set to true, the form data is sent asynchronously via ajax to the form.action url (get)\r\n\t\tajaxFormValidation: false,\r\n\t\t// The url to send the submit ajax validation (default to action)\r\n\t\tajaxFormValidationURL: false,\r\n\t\t// HTTP method used for ajax validation\r\n\t\tajaxFormValidationMethod: 'get',\r\n\t\t// Ajax form validation callback method: boolean onComplete(form, status, errors, options)\r\n\t\t// retuns false if the form.submit event needs to be canceled.\r\n\t\tonAjaxFormComplete: $.noop,\r\n\t\t// called right before the ajax call, may return false to cancel\r\n\t\tonBeforeAjaxFormValidation: $.noop,\r\n\t\t// Stops form from submitting and execute function assiciated with it\r\n\t\tonValidationComplete: false,\r\n\r\n\t\t// Used when you have a form fields too close and the errors messages are on top of other disturbing viewing messages\r\n\t\tdoNotShowAllErrosOnSubmit: false,\r\n\t\t// Object where you store custom messages to override the default error messages\r\n\t\tcustom_error_messages:{},\r\n\t\t// true if you want to vind the input fields\r\n\t\tbinded: true,\r\n\t\t// set to true, when the prompt arrow needs to be displayed\r\n\t\tshowArrow: true,\r\n\t\t// did one of the validation fail ? kept global to stop further ajax validations\r\n\t\tisError: false,\r\n\t\t// Limit how many displayed errors a field can have\r\n\t\tmaxErrorsPerField: false,\r\n\t\t\r\n\t\t// Caches field validation status, typically only bad status are created.\r\n\t\t// the array is used during ajax form validation to detect issues early and prevent an expensive submit\r\n\t\tajaxValidCache: {},\r\n\t\t// Auto update prompt position after window resize\r\n\t\tautoPositionUpdate: false,\r\n\r\n\t\tInvalidFields: [],\r\n\t\tonFieldSuccess: false,\r\n\t\tonFieldFailure: false,\r\n\t\tonSuccess: false,\r\n\t\tonFailure: false,\r\n\t\tvalidateAttribute: \"class\",\r\n\t\taddSuccessCssClassToField: \"\",\r\n\t\taddFailureCssClassToField: \"\",\r\n\t\t\r\n\t\t// Auto-hide prompt\r\n\t\tautoHidePrompt: false,\r\n\t\t// Delay before auto-hide\r\n\t\tautoHideDelay: 10000,\r\n\t\t// Fade out duration while hiding the validations\r\n\t\tfadeDuration: 0.3,\r\n\t // Use Prettify select library\r\n\t prettySelect: false,\r\n\t // Add css class on prompt\r\n\t addPromptClass : \"\",\r\n\t // Custom ID uses prefix\r\n\t usePrefix: \"\",\r\n\t // Custom ID uses suffix\r\n\t useSuffix: \"\",\r\n\t // Only show one message per error prompt\r\n\t showOneMessage: false\r\n\t}};\r\n\t$(function(){$.validationEngine.defaults.promptPosition = methods.isRTL()?'topLeft':\"bottomLeft\"});\r\n})(jQuery);\r\n\r\n\r\n","// Declare app level module which depends on filters, and services\r\n\r\nvar modal = require('./modal'),\r\n controllers = require('./controllers'),\r\n directives = require('./directives'),\r\n services = require('./services'),\r\n filters = require('./filters'),\r\n helpers = require('./helpers'),\r\n directives = require('./directives'),\r\n mask = require('./libs/jquery.mask'),\r\n loading = require('./libs/jquery.isloading'),\r\n validation = require('./libs/jquery.validationEngine'),\r\n notifications = require('./libs/easy.notification');\r\n\r\n(function (angular) {\r\n\r\n 'use strict';\r\n\r\n var app = angular.module('fastActionApp', [\r\n 'fastActionApp.controllers',\r\n 'fastActionApp.filters',\r\n 'fastActionApp.services',\r\n 'fastActionApp.directives'\r\n ]);\r\n\r\n app.config(function ($routeProvider, $locationProvider) {\r\n $routeProvider.\r\n when('/', {\r\n templateUrl: 'partials/front',\r\n controller: 'FrontController'\r\n }).\r\n when('/profile', {\r\n templateUrl: 'partials/profile',\r\n controller: 'ProfileController'\r\n }).\r\n when('/transactions', {\r\n templateUrl: 'partials/transactions',\r\n controller: 'TransactionsController'\r\n }).\r\n when('/auth/actionid', {\r\n templateUrl: 'partials/front',\r\n controller: 'HardReloadController'\r\n }).\r\n when('/auth/actionid_signup', {\r\n templateUrl: 'partials/front',\r\n controller: 'HardReloadController'\r\n }).\r\n when('/logout', {\r\n templateUrl: 'partials/logout',\r\n controller: 'HardReloadController'\r\n }).\r\n when('/login', {\r\n templateUrl: 'partials/front',\r\n controller: 'IESucks'\r\n }).\r\n when('/signup', {\r\n templateUrl: 'partials/front',\r\n controller: 'IESucks'\r\n }).\r\n otherwise({\r\n redirectTo: '/'\r\n });\r\n\r\n $locationProvider.html5Mode(true);\r\n });\r\n\r\n app.run(function ($rootScope, $location, $anchorScroll, $routeParams) {\r\n $rootScope.$on('$routeChangeSuccess', function (newRoute, oldRoute) {\r\n $anchorScroll();\r\n });\r\n });\r\n\r\n})(angular);\r\n","(function($){\r\n var modals = 'section.fastaction-modal';\r\n var close = 'a.fa-modal-close';\r\n var active = 'is-active';\r\n\r\n function checkLogin(){\r\n return $.ajax({\r\n url: '/api/v1/users',\r\n dataType: 'json',\r\n cache: false\r\n }).then(function (data){\r\n if (!data.id) { return data; }\r\n $(modals).removeClass(active);\r\n if (window.location.href.indexOf('/#') < 0){\r\n window.location.href = \"/profile\";\r\n } else {\r\n window.location.href = \"#/profile\";\r\n window.location.reload();\r\n }\r\n });\r\n }\r\n\r\n $('a[data-popup]').unbind();\r\n\r\n $('body').\r\n on('click', 'a#logout', function (e){\r\n e.preventDefault();\r\n e.stopPropagation();\r\n $.ajax({\r\n dataType: 'jsonp',\r\n cache: false,\r\n url: '/logout'\r\n }).then(function (data){\r\n if(data && data.length && Array.isArray(data) && data[0].indexOf('https://') === 0) {\r\n window.location.href = data[0];\r\n } else {\r\n window.location.href = '/';\r\n }\r\n });\r\n }).\r\n on('click', 'a[data-popup]', function (e){\r\n e.preventDefault();\r\n var data = $(this).data(), popup, pop = {\r\n left: 0,\r\n top: 0,\r\n width: data.width || 1000,\r\n height: data.height || 640\r\n };\r\n\r\n if (screen && screen.width && screen.height) {\r\n pop.top = ~~((screen.height/2) - (pop.height/2));\r\n pop.left = ~~((screen.width/2) - (pop.width/2));\r\n }\r\n\r\n pop = 'toolbar=0,menubar=0,location=0,status=0,scrollbars=1,resizable=0,' + $.param(pop).replace(/&/g,',');\r\n popup = window.open(this.href, 'authProvider', pop);\r\n\r\n (function checkPopup(){\r\n if (!popup || popup.closed) { return checkLogin() }\r\n setTimeout(checkPopup, 1000/60);\r\n })();\r\n }).\r\n on('click', 'a[target=\"modal\"]', function (e){ e.preventDefault();\r\n $(modals).not(this.hash).removeClass(active);\r\n $(this.hash).addClass(active).focus();\r\n }).\r\n on('click', close, function (e){ e.preventDefault();\r\n $(this).closest(modals).removeClass(active);\r\n }).\r\n on('keyup', function (e){\r\n if (e.keyCode === 27) {\r\n $(modals+'.'+active).removeClass(active);\r\n }\r\n });\r\n}(jQuery));\r\n","\r\n/* Services */\r\n\r\n(function (angular) {\r\n\r\n 'use strict';\r\n\r\n angular.module('fastActionApp.services', []).value('version', '0.1').\r\n service(\"userService\", function ($http, $q) {\r\n // gets the display name for the provided user\r\n this.sayMyName = function (user) {\r\n if (typeof user !== 'undefined') {\r\n return user.displayName || '';\r\n }\r\n return '';\r\n };\r\n\r\n // returns true if the user has at least one authentication profile\r\n this.isAuthenticated = function (user) {\r\n // TODO seems a little fragile, if any other properties or methods are tacked onto profiles object\r\n return user && user.profiles && !_.isEmpty(user.profiles);\r\n };\r\n\r\n this.getUserForScope = function (user) {\r\n var deferred = $q.defer();\r\n var scope = {\r\n user: user,\r\n isAuthenticated: false,\r\n displayName: '',\r\n hasDisplayName: false\r\n };\r\n\r\n var attachDisplayNameToScope = _.bind(function () {\r\n scope.isAuthenticated = this.isAuthenticated(scope.user);\r\n scope.displayName = this.sayMyName(scope.user);\r\n scope.hasDisplayName = !!(scope.displayName.replace(/\\s/g, ''));\r\n deferred.resolve(scope);\r\n }, this);\r\n\r\n if (_.isEmpty(scope.user)) {\r\n $http({\r\n cache: false,\r\n method: 'GET',\r\n url: '/api/v1/users'\r\n }).\r\n success(function (data) {\r\n if (data.errors && data.errors[0].code === 'USER_NOT_LOGGED_IN') {\r\n scope.loggedin = false;\r\n scope.user = {};\r\n } else {\r\n scope.loggedin = true;\r\n scope.user = data;\r\n }\r\n attachDisplayNameToScope();\r\n }).\r\n error(function (data) {\r\n if (data.errors && data.errors[0].code === 'USER_NOT_LOGGED_IN') {\r\n scope.loggedin = false;\r\n scope.user = {};\r\n }\r\n attachDisplayNameToScope();\r\n });\r\n } else {\r\n attachDisplayNameToScope();\r\n }\r\n return deferred.promise;\r\n };\r\n }).\r\n service(\"profile\", function ($http) {\r\n this.validate = function () {\r\n return $(\"#profile form\").validationEngine('validate');\r\n };\r\n // pass isError=true to show a red banner. passing anything falsy including omitting the parameter entirely shows a green banner\r\n var showFeedback = function (message, data, status, isError) {\r\n $.easyNotification({\r\n text: message,\r\n parent: '#profile',\r\n containerClassName: isError ? \"alert alert-error error\" : \"alert alert-success success\"\r\n });\r\n };\r\n\r\n var resolveCardType = window.resolveCardType = function resolveCardType(accountNumber) {\r\n if (/^5[1-5]/.test(accountNumber)) { return \"mastercard\"; }\r\n if (/^4/.test(accountNumber)) { return \"visa\"; }\r\n if (/^3[47]/.test(accountNumber)) { return \"amex\"; }\r\n if (/^(6011|65|64[4-9]|622)/.test(accountNumber)) { return \"discover\"; }\r\n return \"unknown\";\r\n };\r\n\r\n //Special validation method for validation credit card number and types\r\n window.checkCreditCard = function (field, rules, i, options) {\r\n if (!field.val().luhnCheck()) { return \"Invalid credit card number\"; }\r\n if (resolveCardType(field.val()) === \"unknown\") { return \"Invalid credit card type\"; }\r\n };\r\n\r\n var readOnlyCreditCard = function (updatedProfile) {\r\n if (updatedProfile && updatedProfile.primaryCard) {\r\n return {\r\n primaryCard: updatedProfile.primaryCard,\r\n additionalCards: updatedProfile.additionalCards,\r\n showCreditCardInput: false,\r\n showCancelButton: false,\r\n };\r\n }\r\n return null;\r\n };\r\n\r\n var sendFormData = function (formData, acctNumber, success) {\r\n $.ajax({\r\n type: 'POST',\r\n url: 'api/v2/Forms/1',\r\n data: formData,\r\n success: function (data, status) {\r\n $(\"#profile\").isLoading(\"hide\");\r\n // handles successful 200 responses with bodies containing success=true\r\n if (typeof data.success !== 'undefined' && data.success) {\r\n showFeedback('Your profile was successfully saved.', data, status, false);\r\n success(readOnlyCreditCard(data.updatedProfile));\r\n // handles successful 200 responses with bodies containing success=false\r\n } else {\r\n var msg = data.message || 'An unexpected error has occurred. Please try again later or contact our support.';\r\n showFeedback(msg, data, status, true);\r\n }\r\n }.bind(this),\r\n // handler for errors https://api.jquery.com/jQuery.ajax/\r\n error: function (xhr, status, error) {\r\n $(\"#profile\").isLoading(\"hide\");\r\n showFeedback('An unexpected error has occurred. Please try again later or contact our support.', error, status, true);\r\n }.bind(this),\r\n // \"finally\" callback that gets called no matter what\r\n complete: function (data) {\r\n $(window).scrollTop(0);\r\n },\r\n headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' },\r\n crossDomain: true,\r\n xhrFields: { withCredentials: true }\r\n });\r\n };\r\n\r\n this.send = function (secureForm, success) {\r\n $(\"#profile\").isLoading({\r\n text: \"Loading\",\r\n position: \"overlay\"\r\n });\r\n\r\n var formData = $(\"#profile form\").serialize();\r\n if (secureForm && secureForm.frames && secureForm.frames.length) {\r\n // redact number using VGS Collect. The response should have the redacted number\r\n // so wait for the response to send along with the rest of payload\r\n secureForm.submit('/post', {\r\n // opts\r\n },\r\n // vgs success callback\r\n function (status, res) {\r\n // the HA server does not package the result within a json property\r\n var data = res.json || res;\r\n var redactedAccount = data.Account;\r\n if (redactedAccount) {\r\n formData += '&Account=' + redactedAccount + '&RedactedAccount=' + redactedAccount;\r\n }\r\n var expDate = data.ExpirationDate;\r\n if (expDate) {\r\n var year = parseInt(data.ExpirationDate.Year) % 100;\r\n formData += '&ExpirationMonth=' + ('0' + data.ExpirationDate.Month).slice(-2) + '&ExpirationYear=' + ('0' + year).slice(-2);\r\n }\r\n // resolve the vgs post first and then call post to forms\r\n sendFormData(formData, redactedAccount, success);\r\n },\r\n // vgs error callback\r\n function (errors) {\r\n // everything is fine, try to at least save the rest of the data\r\n formData += '&Account=';\r\n sendFormData(formData, '', success);\r\n });\r\n } else {\r\n sendFormData(formData, $('input[name=\"Account\"]').val(), success);\r\n }\r\n };\r\n });\r\n})(angular);\r\n"]}