Your IP : 18.219.40.177
/**
* Form validators module
* @param {object} window global object
* @param {function} $ jQuery library
* @param {object} EventMgr EventMgr library
* @param {object} App Application
*/
App.Validators = function(window, $, EventMgr, App) {
'use strict';
var init = function() {
EventMgr.on('#main-wrapper', 'input[type="text"].test', 'change', validate);
EventMgr.on('#main-wrapper', 'input[type="text"].testzoom',
'change', multiValidate);
EventMgr.bind('errMsgValid', setErrorMessage);
EventMgr.bind('okMsgValid', setOkMessage);
},
pageInfo = window.pageInfo,
$activeTab = function() {
return $('.tab-content_st_active');
},
//Callback for changed input value
validate = function(e, data) {
var nameValid = this.getAttribute('data-check'),
paramValid = this.getAttribute('data-check-args'),
errMsg = this.getAttribute('data-error-msg'),
fieldName = this.getAttribute('data-fieldname'),
funcName = this.getAttribute('data-funcname'),
prefix = $(this).siblings('.b-input__prefix').html(),
convert = this.getAttribute('data-convert');
if (this.value === '') {
EventMgr.trigger('okMsgValid', { self: this, number: 0, value: '' });
return;
}
//trigger checkvalue
EventMgr.trigger('checkValue', {
name: nameValid,
prefix: prefix,
param: paramValid,
err: errMsg,
fieldname: fieldName,
number: 0,
funcname: funcName,
convert: convert,
self: this,
value: this.value });
},
//function for checking duplicate
checkDuplicate = function(values) {
var i, j, n;
n = values.length;
// to ensure the fewest possible comparisons
// outer loop uses each item i at 0 through n
for (i = 0; i < n; i++) {
// inner loop only compares items j at i+1 to n
for (j = i + 1; j < n; j++) {
if (values[i] === values[j]) { return true; }
}
}
return false;
},
multiValidate = function(e, data) {
if (this.value === '') {
EventMgr.trigger('okMsgValid', { self: this, number: 0, value: '' });
return;
}
var number = 0,
value = this.value,
values = this.value.split(/\s+/),
len = values.length;
if (data) {
number = data.number;
var nextNumber = number + 1;
if (len === nextNumber) {
number = 0;
} else {
number = nextNumber;
}
value = values[nextNumber - 1];
} else {
if (len === 1) {
number = 0;
} else {
if (this.getAttribute('duplicate') !== 'yes') {
if (checkDuplicate(values)) {
EventMgr.trigger('errMsgValid', {
type: 'duplicate',
self: this,
err: pageInfo.duplicate,
number: 0 });
return;
}
}
number = 1;
}
value = this.value.split(/\s+/)[0];
}
var nameValid = this.getAttribute('data-check'),
paramValid = this.getAttribute('data-check-args'),
errMsg = this.getAttribute('data-error-msg'),
fieldName = this.getAttribute('data-fieldname'),
funcName = this.getAttribute('data-funcname'),
convert = this.getAttribute('data-convert');
EventMgr.trigger('checkValue', {
name: nameValid,
param: paramValid,
err: errMsg,
multi: true,
fieldname: fieldName,
funcname: funcName,
self: this,
number: number,
value: value,
convert: convert });
},
replaceValidValue = function(where, what, than) {
var arr = String(where).split(/\s+|\n/),
l = arr.length,
obj = {
v: '',
changed: false
};
while (l--) {
if (String(arr[l]) === String(what)) {
if (String(what) !== String(than)) {
obj.changed = true;
}
arr[l] = than;
break;
}
}
obj.v = arr.join(' ');
return obj;
},
setOkMessage = function(e, data) {
var self = data.self,
number = data.number,
value = data.value,
ovalue = data.ovalue,
vvalue = data.vvalue,
multi = data.multi,
notOk = data.notOk,
tabId,
secondTdElem,
sData = data,
o;
data = {};
data.number = number;
//for multi value
if ((number - 0) !== 0) {
o = replaceValidValue(self.value, vvalue, value);
self.value = o.v;
if (o.changed) {
setWarningError(e, sData);
}
multiValidate.apply(self, [null, data]);
} else {
secondTdElem = $(self).parents('.l-form__col_cont_control');
if (secondTdElem.attr('colspan') - 0 === 2 &&
!secondTdElem.hasClass('formwidth')) {
secondTdElem.attr('colspan', '');
}
if ((value === '' && self.getAttribute('required')) || notOk) {
secondTdElem.parents('.l-form__row')
.removeClass('row-error')
.removeClass('row-ok');
} else {
secondTdElem.parents('.l-form__row')
.removeClass('row-error')
.addClass('row-ok');
}
//replace value if this changed
if (value !== undefined &&
ovalue !== undefined &&
vvalue !== undefined) {
o = {};
if (multi) {
o = replaceValidValue(self.value, vvalue, value);
self.value = o.v;
if (o.changed) {
setWarningError(e, sData);
}
} else if (value !== '') {
if (self.value !== value || o.changed) {
setWarningError(e, sData);
}
self.value = value;
}
}
}
tabId = $(self).closest('.tab-content').attr('data-tabid');
EventMgr.trigger('syncInputToZoom', { tabId: tabId, self: self });
EventMgr.trigger('updFormHeight', { tabId: tabId });
},
setWarningError = function(e, data) {
data.warning = true;
data.err = pageInfo.messages.validChangeVal;
setErrorMessage.apply(window, [e, data]);
},
// Write error
setErrorMessage = function(e, data) {
var msg = data.err,
self = data.self,
name = self.getAttribute('name'),
id = self.getAttribute('id'),
number = data.number,
arrValues = self.value ? self.value.split(' ') : [],
tmp = '',
warning = data.warning,
i, index, tabId, r, secondTdElem;
//show error box if created
if (number - 0 === 0) {
number = arrValues.length;
}
for (i = 0; i < number - 1; i++) {
tmp += arrValues[i] + ' ';
}
index = tmp.length;
var errHTML = '<div class="b-error-box"><div class="b-error-box__top-triangle"></div>' +
'<div class="b-error-box__inner">' + msg + '</div></div>';
$('.b-error-box__wrapper[data-id="' + id + '"]').html(errHTML);
secondTdElem = $(self).parents('.l-form__col_cont_control');
if (!secondTdElem.attr('colspan') && !warning) {
secondTdElem.attr('colspan', '2');
}
if (!warning) {
secondTdElem.parents('.l-form__row')
.addClass('row-error')
.removeClass('row-ok');
} else {
secondTdElem.parents('.l-form__row')
.addClass('row-warning');
setTimeout(function() {
secondTdElem.parents('.l-form__row')
.removeClass('row-warning');
}, 2000);
}
tabId = $(self).closest('.tab-content').attr('data-tabid');
EventMgr.trigger('updFormHeight', { tabId: tabId });
EventMgr.trigger('updateFixedField', { tabId: tabId });
if (!warning) {
//scroll to field
var $self = $(self),
offsetTop = $self.closest('.l-form__row')[0] ?
$self.closest('.l-form__row')[0].offsetTop : 0,
$page = $self.closest('.b-form-page'),
$formSW = $('#form-scroll-' + tabId),
MAGICNUMBER = 62 + 12 + 2 + 2; //button block height + padding + margin
if ($page.hasClass('b-form-page_st_collapsed')) {
$page.find('.i-form-page__title').trigger('click');
}
//it can be extform
if ($formSW.length) {
var height = parseFloat($formSW[0].style.height),
scrollTop = $formSW[0].scrollTop;
if ($page[0]) {
offsetTop += $page[0].offsetTop;
}
//offsetTop -= MAGICNUMBER;
offsetTop += MAGICNUMBER;
//scrolltop when not in viewport
if (offsetTop < scrollTop || height + scrollTop < offsetTop) {
EventMgr.trigger('scrollTo', {
id: 'form-scroll-' + tabId,
offsetTop: offsetTop,
animate: false,
raw: false
});
}
}
//setfocus and cursor
//check for type=file
if (String(self.getAttribute('type')).toLowerCase() !== 'file') {
if (self.offsetWidth !== 0) {
self.focus();
window.scrollTo(0, 0);
if (self.setSelectionRange) {
self.setSelectionRange(index, index);
} else if (self.createTextRange) {
r = self.createTextRange();
r.collapse(true);
r.select(index, index);
}
} else if (self.nextSibling) {
//for passwd I think
self.nextSibling.focus();
window.scrollTo(0, 0);
if (self.setSelectionRange) {
self.nextSibling.setSelectionRange(index, index);
} else {
r = self.nextSibling.createTextRange();
r.collapse(true);
r.select(index, index);
}
}
}
}
};
return {
init: init
};
}(window, $, EventMgr, App);