var DATA_IGNORE = 'data-ignoreaccessibilityfix'; var DATA_EVENT_CHANGE_ADDED = 'data-changeadded'; var DATA_INVALID_URL = 'data-invalidurl'; var DATA_INVALID_EMAIL = 'data-invalidemail'; var DATA_INVALID_RANGE = 'data-invalidrange'; var DATA_INVALID_LENGTH = 'data-invalidlength'; var DATA_INVALID_PATTERN = 'data-invalidpattern'; var DATA_INVALID_REQUIRED = 'data-invalidrequired'; var DATA_INVALID_DATE = 'data-invaliddate'; var DATA_INVALID_TIME = 'data-invalidtime'; var DATA_INVALID_DATETIME = 'data-invaliddatetime'; var DATA_INVALID_MONTH = 'data-invalidmonth'; var DATA_INVALID_WEEK = 'data-invalidweek'; var VALIDATION_TYPE = 'type'; var VALIDATION_REQUIRED = 'required'; var VALIDATION_PATTERN = 'pattern'; var VALIDATION_LENGTH = 'length';

var isValid = function (field) {

if (field.hasAttribute(DATA_INVALID_URL)) {
        return false;
} else if (field.hasAttribute(DATA_INVALID_EMAIL)) {
        return false;
} else if (field.hasAttribute(DATA_INVALID_RANGE)) {
        return false;
} else if (field.hasAttribute(DATA_INVALID_LENGTH)) {
        return false;
} else if (field.hasAttribute(DATA_INVALID_PATTERN)) {
        return false;
} else if (field.hasAttribute(DATA_INVALID_REQUIRED)) {
        return false;
} else if (field.hasAttribute(DATA_INVALID_DATE)) {
        return false;
} else if (field.hasAttribute(DATA_INVALID_TIME)) {
        return false;
} else if (field.hasAttribute(DATA_INVALID_DATETIME)) {
        return false;
} else if (field.hasAttribute(DATA_INVALID_MONTH)) {
        return false;
} else if (field.hasAttribute(DATA_INVALID_WEEK)) {
        return false;
} else {
        return true;
}

};

var validateNow = function (field, dataInvalid, validateFunction) {

if (validateFunction(field)) {
        if (field.hasAttribute(dataInvalid)) {
                field.removeAttribute(dataInvalid);
                if ((field.hasAttribute('aria-invalid')) && (isValid(field))) {
                        field.removeAttribute('aria-invalid');
                }
        }
} else {
        field.setAttribute(dataInvalid, 'true');
        field.setAttribute('aria-invalid', 'true');
}

};

var validate = function (idField, dataInvalid, typeFix, validateFunction) {

var field = document.getElementById(idField);
validateNow(field, dataInvalid, validateFunction);
addEventHandler(field, 'change', DATA_EVENT_CHANGE_ADDED, typeFix, function (event) {
        return validateNow(field, dataInvalid, validateFunction);
});

};

var isValidRegularExpression = function (value, pattern) {

var regularExpression;
regularExpression = new RegExp(pattern);
return regularExpression.test(value);

};

var isValidURL = function (field) {

return isEmpty(field.value) || isValidRegularExpression(field.value, '([a-zA-Z][a-zA-Z0-9\\+\\.\\-]*):(\\/\\/)?(?:(?:(?:[a-zA-Z0-9_\\.' + '\\-\\+!$&\'\\(\\)*\\+,;=]|%[0-9a-f]{2})+:)*(?:[a-zA-Z0-9_\\.\\-\\+' + '%!$&\'\\(\\)*\\+,;=]|%[0-9a-f]{2})+@)?(?:(?:[a-z0-9\\-\\.]|%' + '[0-9a-f]{2})+|(?:\\[(?:[0-9a-f]{0,4}:)*(?:[0-9a-f]{0,4})\\]))' + '(?::[0-9]+)?(?:[\\/|\\?](?:[a-zA-Z0-9_#!:\\.\\?\\+=&@!$\'~*,;\\/' + '\\(\\)\\[\\]\\-]|%[0-9a-f]{2})*)?');

};

var isValidEmail = function (field) {

var regularExpression;
regularExpression = '(?:[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&' + '\'*+\/=?^_`{|}~-]+)*|"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21' + '\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*")' + '@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*' + '[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}' + '(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:' + '[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|' + '\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])';
if (field.hasAttribute('multiple')) {
        regularExpression = regularExpression + "( *, *" + regularExpression + ")*";
}
return isEmpty(field.value) || isValidRegularExpression(field.value, "^(" + regularExpression + ")?$");

};

var isValidDate = function (field) {

return isEmpty(field.value) || isValidRegularExpression(field.value, '^([0-9]{2}((((' + '[02468][048])|([13579][26]))-(02)-((0[1-9])|([12][0-9])))|' + '(([0-9]{2})-((02-((0[1-9])|(1[0-9])|(2[0-8])))|(((0[469])|(11))-' + '((0[1-9])|([12][0-9])|(30)))|(((0[13578])|(10)|(12))-((0[1-9])|' + '([12][0-9])|(3[01])))))))?$');

};

var isValidTime = function (field) {

return isEmpty(field.value) || isValidRegularExpression(field.value, '^((([01][0-9])|' + '(2[0-3])):[0-5][0-9])?$');

};

var isValidDateTime = function (field) {

return isEmpty(field.value) || isValidRegularExpression(field.value, '^([0-9]{2}((((' + '[02468][048])|([13579][26]))-(02)-((0[1-9])|([12][0-9])))|' + '(([0-9]{2})-((02-((0[1-9])|(1[0-9])|(2[0-8])))|(((0[469])|(11))-' + '((0[1-9])|([12][0-9])|(30)))|(((0[13578])|(10)|(12))-((0[1-9])|' + '([12][0-9])|(3[01]))))))T(([01][0-9])|(2[0-3])):[0-5][0-9]((:[0-5]' + '[0-9].[0-9])|(Z))?)?$');

};

var isValidMonth = function (field) {

return isEmpty(field.value) || isValidRegularExpression(field.value, '^([0-9]{4}-' + '((0[1-9])|(1[0-2])))?$');

};

var isValidWeek = function (field) {

return isEmpty(field.value) || isValidRegularExpression(field.value, '^([0-9]{4}-W' + '((0[1-9])|([1-4][0-9])|(5[0-3])))?$');

};

var isValidRange = function (field) {

var maxValue, minValue, value;
if (!isEmpty(field.value)) {
        if (!isValidRegularExpression(field.value, '^[-+]?[0-9]+([.,][0-9]+)?$')) {
                return false;
        }
        value = parseFloat(field.value);
        if (field.hasAttribute('min') || field.hasAttribute('aria-valuemin')) {
                if (field.hasAttribute('min')) {
                        minValue = parseFloat(field.getAttribute('min'));
                } else if (field.hasAttribute('aria-valuemin')) {
                        minValue = parseFloat(field.getAttribute('aria-valuemin'));
                }
                if (value < minValue) {
                        return false;
                }
        }
        if (field.hasAttribute('max') || field.hasAttribute('aria-valuemax')) {
                if (field.hasAttribute('max')) {
                        maxValue = parseFloat(field.getAttribute('max'));
                } else if (field.hasAttribute('aria-valuemax')) {
                        maxValue = parseFloat(field.getAttribute('aria-valuemax'));
                }
                if (value > maxValue) {
                        return false;
                }
        }
}
return true;

};

var isValidLength = function (field) {

if (field.hasAttribute('minlength')) {
        if (field.value.length < parseInt(field.getAttribute('minlength'))) {
                return false;
        }
}
if (field.hasAttribute('maxlength')) {
        if (field.value.length > parseInt(field.getAttribute('maxlength'))) {
                return false;
        }
}
return true;

};

var isValidPattern = function (field) {

return isValidRegularExpression(field.value, field.getAttribute('pattern'));

};

var isValidRequired = function (field) {

return !isEmpty(field.value);

};

window.addEventListener('load', function() {

for (var i = 0, length = hatemileValidationList.required_fields.length; i < length; i++) {
        validate(hatemileValidationList.required_fields[i], DATA_INVALID_REQUIRED, VALIDATION_REQUIRED, isValidRequired);
}

for (var i = 0, length = hatemileValidationList.pattern_fields.length; i < length; i++) {
        validate(hatemileValidationList.pattern_fields[i], DATA_INVALID_PATTERN, VALIDATION_PATTERN, isValidPattern);
}

for (var i = 0, length = hatemileValidationList.fields_with_length.length; i < length; i++) {
        validate(hatemileValidationList.fields_with_length[i], DATA_INVALID_LENGTH, VALIDATION_LENGTH, isValidLength);
}

for (var i = 0, length = hatemileValidationList.range_fields.length; i < length; i++) {
        validate(hatemileValidationList.range_fields[i], DATA_INVALID_RANGE, VALIDATION_TYPE, isValidRange);
}

for (var i = 0, length = hatemileValidationList.week_fields.length; i < length; i++) {
        validate(hatemileValidationList.week_fields[i], DATA_INVALID_WEEK, VALIDATION_TYPE, isValidWeek);
}

for (var i = 0, length = hatemileValidationList.month_fields.length; i < length; i++) {
        validate(hatemileValidationList.month_fields[i], DATA_INVALID_MONTH, VALIDATION_TYPE, isValidMonth);
}

for (var i = 0, length = hatemileValidationList.datetime_fields.length; i < length; i++) {
        validate(hatemileValidationList.datetime_fields[i], DATA_INVALID_DATETIME, VALIDATION_TYPE, isValidDateTime);
}

for (var i = 0, length = hatemileValidationList.time_fields.length; i < length; i++) {
        validate(hatemileValidationList.time_fields[i], DATA_INVALID_TIME, VALIDATION_TYPE, isValidTime);
}

for (var i = 0, length = hatemileValidationList.date_fields.length; i < length; i++) {
        validate(hatemileValidationList.date_fields[i], DATA_INVALID_DATE, VALIDATION_TYPE, isValidDate);
}

for (var i = 0, length = hatemileValidationList.email_fields.length; i < length; i++) {
        validate(hatemileValidationList.email_fields[i], DATA_INVALID_EMAIL, VALIDATION_TYPE, isValidEmail);
}

for (var i = 0, length = hatemileValidationList.url_fields.length; i < length; i++) {
        validate(hatemileValidationList.url_fields[i], DATA_INVALID_URL, VALIDATION_TYPE, isValidURL);
}

});