PageSourceSearch

https://www.turkticaret.net/members/v2/templates/js/validation.js?ver=180620251339

js turkticaret.net collected 2026-09-24 12:18:42 UTC 23,644 bytes, 614 lines download raw bytes

1
2var replaceWithUnicode = false;
3var errorClass = 'input-feedback-error';
4
5function setErrorClass(customClass){
6    window.errorClass = customClass;
7}
8
9function getErrorMessage(ruleName, ruleParam, $input) {
10    var inputTitle = $($input).data('validate-title') || $($input).attr('name') || $($input).attr('id');
11    switch (ruleName) {
12        case 'required': return 'Lütfen boş bırakmayınız.';
13        case 'name_surname': return 'Lütfen geçerli bir ad soyad bilgisi giriniz.';
14        case 'company_name': return 'Lütfen geçerli bir firma adı bilgisi giriniz.';
15        case 'minwords': return `Lütfen en az ${ruleParam} kelime giriniz.`;
16        case 'min': return `Lütfen en az ${ruleParam} karakter giriniz.`;
17        case 'max': return `Lütfen en fazla ${ruleParam} karakter giriniz.`;
18        case 'email': return 'Lütfen geçerli bir e-posta adresi giriniz.';
19        case 'domain': return 'Lütfen geçerli bir alan adı giriniz.';
20        case 'domain_xn': return 'Lütfen geçerli bir alan adı giriniz (Türkçe karakter içermemelidir).';
21        case 'numeric': return 'Lütfen sadece sayısal değer giriniz.';
22        case 'phone_number': return 'Lütfen geçerli bir telefon numarası giriniz.';
23        case 'phone_body': return 'Telefon numarası 0 ile başlamamalı ve 10-13 hane olmalıdır. Örnek: 5321234567';
24        case 'lower': return 'Lütfen sadece küçük harfler kullanınız.';
25        case 'upper': return 'Lütfen sadece büyük harfler kullanınız.';
26        case 'alpha': return 'Lütfen sadece alfabetik karakterler kullanınız.';
27        case 'alpha_num': return 'Lütfen sadece harf ve rakam kullanınız.';
28        case 'alpha_num_punct': return 'Lütfen sadece harf, rakam ve noktalama işaretleri kullanınız.';
29        case 'no_turkish_chars': return 'Lütfen Türkçe karakter kullanmayınız.';
30        case 'regex': return 'Geçerli bir formatta değer giriniz.';
31        case 'confirmed':
32            var confirmField = $("#" + ruleParam);
33            var confirmFieldTitle = confirmField.data('validate-title') || confirmField.attr('name') || confirmField.attr('id');
34            return `${inputTitle} alanının, ${confirmFieldTitle} alanı ile aynı olması gerekir.`;
35        case 'either':
36        case 'either_check':
37            var fields = ruleParam.split(',');
38            var fieldNames = fields.map(function(fieldId) {
39                var $field = $("#" + fieldId);
40                return $field.data('validate-title') || $field.attr('name') || $field.attr('id');
41            });
42            return `${fieldNames.join(', ')} alanlarından en az bir alanın doldurulması gerekir.`;
43        case 'dependent_on':
44            var dependentField = $("#" + ruleParam);
45            var dependentFieldName = dependentField.data('validate-title') || dependentField.attr('name') || dependentField.attr('id');
46            return `Bu alan, ${dependentFieldName} alanı gönderildiğinde zorunludur.`;
47        case 'only_one':
48        case 'only_one_check':
49            var fields = ruleParam.split(',');
50            var fieldNames = fields.map(function(fieldId) {
51                var $field = $("#" + fieldId);
52                return $field.data('validate-title') || $field.attr('name') || $field.attr('id');
53            });
54            return `${fieldNames.join(', ')} alanlarından sadece bir alanın doldurulması gerekir.`;
55        case 'active_url': return 'Lütfen geçerli bir URL giriniz.';
56        case 'alpha_dash': return 'Lütfen yalnızca harfler, rakamlar, tire (-) ve alt çizgi (_) kullanınız.';
57        case 'digits_between': return `Lütfen ${ruleParam.split(',')[0]} ile ${ruleParam.split(',')[1]} arasında bir sayı giriniz.`;
58        case 'different': return 'Bu alan, belirtilen alandan farklı olmalıdır.';
59        case 'in': return `Lütfen ${ruleParam.split(',').join(", ")} değerlerinden birini giriniz.`;
60        case 'ip': return 'Lütfen geçerli bir IP adresi giriniz.';
61        case 'not_in': return `Girilen değer ${ruleParam.split(',').join(", ")} değerlerinden birisi olmamalıdır.`;
62        case 'tc_no': return 'Lütfen geçerli bir TC kimlik numarası giriniz.';
63        case 'tax_no': return 'Lütfen geçerli bir vergi numarası giriniz.';
64        case 'must_check': return 'Devam etmek için lütfen bu alanı işaretleyin';
65        default: return '';
66    }
67}
68
69function validateEmail(value) {
70    var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}$/;
71    return emailPattern.test(value);
72}
73
74function validateDomain(value, trChar) {
75    // TODO: iso dosyalarda türkçe karakter hatası alınıyor ise alttaki no_turkish_char
76    // metodundaki gibi bunun da güncellenmezi gerekiyor.
77    if (trChar) {
78        var domainRegexTr = /^(?:[a-z0-9üöçışğ]+(?:[\-\.][a-z0-9üöçışğ]+)*|xn--[a-z0-9\-]+)\.[a-züöçışğ]{2,6}$/i;
79        return domainRegexTr.test(value);
80    } else {
81        var domainRegexNonTr = /^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}$/i;
82        return domainRegexNonTr.test(value);
83    }
84}
85
86function validateNumeric(value) {
87    return $.isNumeric(value);
88}
89
90function validatePhoneNumber(value) {
91    // Format 1: (123) 456 78 90
92    const formattedRegex = /^\(\d{3}\)\s\d{3}\s\d{2}\s\d{2}$/;
93
94    // Format 2: 10 veya 11 haneli sadece rakam içeren (örn: 5551234567 veya 05551234567)
95    const plainRegex = /^\d{10,11}$/;
96
97    return formattedRegex.test(value) || plainRegex.test(value);
98}
99
100function validatePhoneBody(value) {
101    // Alan kodundan sonraki telefon govdesi: 10-13 hane, 0 ile baslamaz, sadece rakam
102    const phoneBodyRegex = /^[1-9]\d{9,12}$/;
103    return phoneBodyRegex.test(value);
104}
105
106function validateLower(value) {
107    return value === value.toLowerCase();
108}
109
110function validateUpper(value) {
111    return value === value.toUpperCase();
112}
113
114function validateNameSurname(value) {
115    var alphaPattern = /^[a-zA-ZçÇğĞıİöÖşŞüÜ]{2,}( [a-zA-ZçÇğĞıİöÖşŞüÜ]{2,})+$/;
116    if (replaceWithUnicode) {
117        value = replaceTurkishCharsWithUnicode(value, replaceWithUnicode);
118        alphaPattern = /^[a-zA-Z\u00e7\u00c7\u011f\u011e\u0131\u0130\u00f6\u00d6\u015f\u015e\u00fc\u00dc]{2,}( [a-zA-Z\u00e7\u00c7\u011f\u011e\u0131\u0130\u00f6\u00d6\u015f\u015e\u00fc\u00dc]{2,})+$/;
119        return alphaPattern.test(value);
120    }
121
122    return alphaPattern.test(value);
123}
124
125function validateCompanyName(value) {
126    var alphaPattern = /^[a-zA-ZçÇğĞıİöÖşŞüÜ0-9&.,' -]{2,}$/;
127
128    if (replaceWithUnicode) {
129        value = replaceTurkishCharsWithUnicode(value, replaceWithUnicode);
130        alphaPattern = /^[a-zA-Z\u00e7\u00c7\u011f\u011e\u0131\u0130\u00f6\u00d6\u015f\u015e\u00fc\u00dc0-9&.,' -]{2,}$/;
131        return alphaPattern.test(value);
132    }
133
134    return alphaPattern.test(value);
135}
136
137function validateAlpha(value) {
138    var alphaPattern = /^[A-Za-zçÇğĞıİöÖşŞüÜ\s]+$/;
139
140    value = value.trim();
141    if (replaceWithUnicode) {
142        value = replaceTurkishCharsWithUnicode(value, replaceWithUnicode);
143        alphaPattern = /^[A-Za-z\u00e7\u00c7\u011f\u011e\u0131\u0130\u00f6\u00d6\u015f\u015e\u00fc\u00dc\s]+$/;
144        return alphaPattern.test(value);
145    }
146    return alphaPattern.test(value);
147}
148
149function validateAlphaNum(value) {
150    var alphaNumPattern = /^[A-Za-z0-9çÇğĞıİöÖşŞüÜ\s]+$/;
151
152    value = value.trim();
153    if (replaceWithUnicode) {
154        value = replaceTurkishCharsWithUnicode(value, replaceWithUnicode);
155        alphaNumPattern = /^[A-Za-z0-9\u00e7\u00c7\u011f\u011e\u0131\u0130\u00f6\u00d6\u015f\u015e\u00fc\u00dc\s]+$/;
156        return alphaNumPattern.test(value);
157    }
158    return alphaNumPattern.test(value);
159}
160
161function validateMin(value, minLength) {
162    value = value.trim();
163    return value.length >= minLength;
164}
165
166function validateMax(value, maxLength) {
167    value = value.trim();
168    return value.length <= maxLength;
169}
170
171function validateRequired(value) {
172    return value !== null && value !== undefined && value.trim() !== '' && value !== 'default';
173}
174
175function validateRegex(value, pattern) {
176    var regexPattern = new RegExp(pattern);
177    return regexPattern.test(value);
178}
179
180function validateConfirmed(value, confirmValue) {
181    var confirmedInput = $("#" + confirmValue);
182    return value === confirmValue.val();
183}
184
185function validateEither(fields) {
186    var validateList = [];
187    $.each(fields, function (key, field){
188        var value = $('#'+field).val()
189        if (value.trim() !== ''){
190            validateList.push(value)
191        }
192    })
193    return validateList.length >= 1;
194}
195
196function validateEitherCheck(fields) {
197    var validateList = [];
198    $.each(fields, function (key, field){
199        var value = $('#'+field).is(':checked')
200        if ($('#'+field).is(':checked')){
201            validateList.push(value)
202        }
203    })
204    return validateList.length >= 1;
205}
206
207function validateDependentOn(value, ruleParams) {
208    var dependentParams = ruleParams.split(',');
209    var dependentInput = $("#" + dependentParams[0]);
210    if (dependentInput.val() == null) {
211        return false;
212    }
213
214    if (dependentParams[1] !== undefined){
215        return dependentInput.val().trim() === dependentParams[1]
216    }
217    return dependentInput.val().trim() !== '';
218}
219
220function validateDependentOnNot(value, ruleParams) {
221    var dependentParams = ruleParams.split(',');
222    var dependentInput = $("#" + dependentParams[0]);
223    if (dependentInput.val() == null) {
224        return false;
225    }
226
227    if (dependentParams[1] !== undefined){
228        return dependentInput.val().trim() !== dependentParams[1]
229    }
230    return dependentInput.val().trim() !== '';
231}
232
233function validateDependentOnCheck(value, dependentElement) {
234    var dependentInput = $("#" + dependentElement);
235    console.log(dependentInput.prop('checked'));
236    return dependentInput.prop('checked');
237}
238
239function validateDependentOnCheckNot(value, dependentElement) {
240    var dependentInput = $("#" + dependentElement);
241    console.log(dependentInput.is(':checked'));
242    return !dependentInput.is(':checked');
243}
244
245function validateOnlyOne(fields) {
246    var validateList = [];
247    $.each(fields, function (key, field){
248        var value = $('#'+field).val()
249        if (value.trim() !== ''){
250            validateList.push(value)
251        }
252    })
253    return validateList.length = 1;
254}
255
256function validateOnlyOneCheck(fields) {
257    var validateList = [];
258    $.each(fields, function (key, field){
259        var value = $('#'+field).is(':checked')
260        if ($('#'+field).is(':checked')){
261            validateList.push(value)
262        }
263    })
264    return validateList.length == 1;
265}
266
267function validateActiveUrl(value) {
268    var urlPattern = /^(https?:\/\/)?((\d{1,3}\.){3}\d{1,3}|[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})(:\d+)?(\/[^\s]*)?$/i;
269    return urlPattern.test(value);
270}
271
272function validateAlphaDash(value) {
273    var alphaDashPattern = /^[A-Za-z0-9_-]+$/;
274    return alphaDashPattern.test(value);
275}
276
277function validateAlphaNumPunct(value) {
278    // Harf, rakam, Türkçe karakterler, boşluk, noktalama ve metin düzenleme karakterleri
279    // Emoji'leri ve diğer özel karakterleri engeller
280    // Desteklenen: alt tire (_), üst tire (^), en/em dash (–—), akıllı tırnak (''"""), ellipsis (…), derece (°), vb.
281    var alphaNumPunctPattern = /^[A-Za-z0-9çÇğĞıİöÖşŞüÜ\s_\-\.!?,;:'"()\[\]{}\/\\@#$%^&*+=~`|<>–—''""…·°]*$/;
282    return alphaNumPunctPattern.test(value);
283}
284
285function validateDigitsBetween(value, min, max) {
286    var numericValue = parseInt(value, 10);
287    return !isNaN(numericValue) && numericValue >= min && numericValue <= max;
288}
289
290function validateDifferent(value, compareValue) {
291    var compareInput = $("#" + compareValue);
292    return value !== compareInput.val();
293}
294
295function validateIn(value, allowedValues) {
296    return allowedValues.split(',').includes(value);
297}
298
299function validateIp(value) {
300    var ipPattern = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
301    return ipPattern.test(value);
302}
303
304function validateNotIn(value, forbiddenValues) {
305    return !forbiddenValues.split(',').includes(value);
306}
307
308function validateMinWords(value, minWords) {
309    if (!value) return false;
310    return value.trim().split(/\s+/).length >= minWords;
311}
312
313function validateNoTurkishChars(value) {
314    if (replaceWithUnicode) {
315        value = replaceTurkishCharsWithUnicode(value, replaceWithUnicode);
316        const turkishChars = /[\u00e7\u00c7\u011f\u011e\u0131\u0130\u00f6\u00d6\u015f\u015e\u00fc\u00dc]/;
317        return !turkishChars.test(value);
318    }
319
320    const turkishChars = /[çÇğĞıİöÖşŞüÜ]/;
321    return !turkishChars.test(value);
322}
323
324function validateNullable(value) {
325    if (!value || value == null || value == '') return false;
326    return true;
327}
328
329function mustCheck(element) {
330    return $(element).is(':checked');
331}
332
333
334function validateInput(ruleName, value, ruleParam, $input) {
335    switch (ruleName) {
336        case 'required': return validateRequired(value);
337        case 'name_surname': return validateNameSurname(value);
338        case 'company_name': return validateCompanyName(value);
339        case 'minwords': return validateMinWords(value, ruleParam)
340        case 'no_turkish_chars': return validateNoTurkishChars(value)
341        case 'min': return validateMin(value, ruleParam);
342        case 'max': return validateMax(value, ruleParam);
343        case 'email': return validateEmail(value);
344        case 'domain': return validateDomain(value, true);
345        case 'domain_xn': return validateDomain(value, false);
346        case 'numeric': return validateNumeric(value);
347        case 'phone_number': return validatePhoneNumber(value);
348        case 'phone_body': return validatePhoneBody(value);
349        case 'lower': return validateLower(value);
350        case 'upper': return validateUpper(value);
351        case 'alpha': return validateAlpha(value);
352        case 'alpha_num': return validateAlphaNum(value);
353        case 'alpha_num_punct': return validateAlphaNumPunct(value);
354        case 'regex': return validateRegex(value, ruleParam);
355        case 'confirmed': return validateConfirmed(value, ruleParam);
356        case 'either': return validateEither(ruleParam.split(','));
357        case 'either_check': return validateEitherCheck(ruleParam.split(','));
358        case 'dependent_on': return validateDependentOn(value, ruleParam);
359        case 'dependent_on_not': return validateDependentOnNot(value, ruleParam);
360        case 'dependent_on_check': return validateDependentOnCheck(value, ruleParam);
361        case 'dependent_on_check_not': return validateDependentOnCheckNot(value, ruleParam);
362        case 'only_one': return validateOnlyOne(ruleParam.split(','));
363        case 'only_one_check': return validateOnlyOneCheck(ruleParam.split(','));
364        case 'active_url': return validateActiveUrl(value);
365        case 'alpha_dash': return validateAlphaDash(value);
366        case 'digits_between': return validateDigitsBetween(value, ruleParam.split(',')[0], ruleParam.split(',')[1]);
367        case 'different': return validateDifferent(value, ruleParam);
368        case 'in': return validateIn(value, ruleParam);
369        case 'ip': return validateIp(value);
370        case 'not_in': return validateNotIn(value, ruleParam);
371        case 'nullable': return validateNullable(value);
372        case 'tax_no': return vergiKimlikKontrol(value);
373        case 'tc_no': return tcKimlikKontrol(value);
374        case 'must_check': return mustCheck($input);
375        default: return true;
376    }
377}
378
379function sendApiRequest(getUrl){
380    var xx = $.ajax({
381        url: getUrl,
382        success: function (result) {
383        },
384        async: false
385    });
386    return JSON.parse(xx.responseText);
387}
388
389function vergiKimlikKontrol(kno){
390    if (kno.length >= 10){
391        var data = sendApiRequest('/siberhosting/sepet-fatura-islemleri.php?action=validateTaxNo&tax_no='+kno);
392        if(data == 1){
393            return true;
394        }
395    }
396
397    return false;
398}
399
400function tcKimlikKontrol(tc_no){
401    if (tc_no.length >= 11){
402        var data = sendApiRequest('/siberhosting/sepet-fatura-islemleri.php?action=validateTCNo&tc_no='+tc_no);
403
404        if(data == 1){
405            return true;
406        }
407    }
408
409
410    return false;
411}
412
413function getValidateRules(element){
414    var rules = $(element).data('validate');
415    return rules ? rules.split('|') : [];
416}
417
418function getValidateParams(rule){
419    return rule.split(':')[1];
420}
421
422function replaceTurkishCharsWithUnicode(text) {
423    const turkishToUnicode = {
424        "ç": "\u00e7", "Ç": "\u00c7",
425        "ğ": "\u011f", "Ğ": "\u011e",
426        "ı": "\u0131", "İ": "\u0130",
427        "ö": "\u00f6", "Ö": "\u00d6",
428        "ş": "\u015f", "Ş": "\u015e",
429        "ü": "\u00fc", "Ü": "\u00dc"
430    };
431
432    $.each(turkishToUnicode, function(char, unicode) {
433        const regex = new RegExp(char, 'g');
434        text = text.replace(regex, unicode);
435    });
436
437    return text;
438}
439
440
441
442function processValidation(element, parentElement){
443    var foundError = false;
444    let foundedRule = '';
445    var $input = $(element);
446    var errorPosition = $input.data('validate-error-position');
447    var insertAfterEl = $input;
448    if (errorPosition !== undefined){
449        insertAfterEl = $('#'+errorPosition)
450    }
451
452    var rules = getValidateRules($input);
453    var value = $input.val();
454    var errorDiv = $("#" + $input.attr('id') + "_error");
455
456    for (var i = 0; i < rules.length; i++) {
457        var ruleParts = rules[i].split(':');
458        var ruleName = ruleParts[0];
459        var ruleParam = ruleParts[1] || '';
460
461
462        if (!validateInput(ruleName, value, ruleParam, $input)) {
463            if (ruleName === 'dependent_on' || ruleName === 'dependent_on_check' ||
464                ruleName === 'dependent_on_not' || ruleName === 'dependent_on_check_not' ||
465                ruleName === 'nullable'){
466                break;
467            }
468
469            var errorMessage = getErrorMessage(ruleName, ruleParam, $input);
470            if (replaceWithUnicode){
471                errorMessage = replaceTurkishCharsWithUnicode(errorMessage);
472            }
473            if (errorMessage !== ''){
474                if (errorDiv.length){
475                    errorDiv.text(errorMessage)
476                }else {
477                    addError($input, errorMessage, insertAfterEl)
478                }
479                $('#'+parentElement).data('valid', false);
480                foundError = true;
481                foundedRule = ruleName
482                break;
483            }
484        }
485    }
486    if (!foundError){
487        if (checkFormHasErrors(parentElement) == 1 && $('#'+$input.attr('id') + '_error').length > 0){
488            $('#'+parentElement).data('valid', true);
489        }
490        $("#" + $input.attr('id') + "_error").animate(
491            { opacity:0 },
492            125, function (){
493                $("#" + $input.attr('id') + "_error").css('opacity', 1)
494                $("#" + $input.attr('id') + "_error").remove();
495            });
496    }
497
498    return foundError;
499}
500
501function addError($input, message, insertAfterEl = null){
502    if (insertAfterEl === null){
503        insertAfterEl = $input;
504    }
505
506    $('<div>', {
507        id: $input.attr('id') + '_error',
508        text: message[0].toUpperCase() + message.slice(1),
509    }).addClass(window.errorClass).css('opacity', 0).insertAfter(insertAfterEl);
510
511    $("#" + $input.attr('id') + "_error").animate({ opacity:1 }, 125);
512}
513
514function validateForm(parentElement, _replaceWithUnicode = false) {
515    // YAZILIMCININ NOTU:
516    // Burada oluşturulan validasyon metodları diğer sayfalarda sorunsuz çalışmaktadır.
517    // Validasyonların içeriklerini değiştirirken eğer yeterince isteneni kapsamıyor ise
518    // yeni bir metod oluşturulması gerekiyor.
519    var error = false;
520    replaceWithUnicode = _replaceWithUnicode;
521    $("#" + parentElement).find("*[data-validate]").each(function() {
522        var validateResult = processValidation($(this), parentElement)
523        if (validateResult){
524            error = true;
525        }
526    });
527
528    if ($('#'+parentElement+' .input-feedback-error').length == 0 || $('#'+parentElement).data('valid') == true ){
529        $('#'+parentElement).find('button[type="submit"]').prop('disabled', false).removeClass('disabled')
530    } else {
531        $('#'+parentElement).find('button[type="submit"]').prop('disabled', true).addClass('disabled')
532    }
533
534    return error;
535}
536
537function checkFormHasErrors(parentElement){
538    return $('#'+parentElement+' .input-feedback-error').length
539}
540
541function prepareValidateListeners(parentElement, _replaceWithUnicode = false, validationEvents = 'change keyup') {
542    replaceWithUnicode = _replaceWithUnicode;
543    validateInputListener(parentElement, validationEvents);
544    validateSelectListener(parentElement);
545}
546
547function unbindValidateListeners(parentElement){
548    validateInputUnbindListener(parentElement)
549    validateSelectUnbindListener(parentElement)
550}
551
552function validateInputListener(parentElement, validationEvents) {
553    $("#" + parentElement + ' input[data-validate], #' + parentElement + ' textarea[data-validate]').on(validationEvents, function () {
554        var rules = getValidateRules($(this))
555        $.each(rules, function (key, rule){
556            if (rule.startsWith('either') || rule.startsWith('either_check') ||
557                rule.startsWith('only_one') || rule.startsWith('only_one_check')){
558                var params = getValidateParams(rule)
559                $.each(params.split(','), function (key, param){
560                    processValidation($('#'+param), parentElement);
561                })
562            }
563        })
564        processValidation($(this), parentElement)
565        if (($('#'+parentElement+' .input-feedback-error').length == 0 || $('#'+parentElement).data('valid') == true)){
566            $('#'+parentElement).find('button[type="submit"]').prop('disabled', false).removeClass('disabled')
567        } else {
568            $('#'+parentElement).find('button[type="submit"]').prop('disabled', true).addClass('disabled')
569        }
570    })
571}
572function checkRequiredInputs(parentElement){
573    let errorFound = false;
574
575    let allInputs = $("#" + parentElement).find('[data-validate*="required"]')
576
577    allInputs.each(function (key, input){
578        if (($(input).attr('type') != 'hidden' && !$(input).hasClass('hidden')) && ($(input).val() === null || $(input).val() === '')){
579            errorFound = true;
580        }
581    })
582
583    return errorFound;
584}
585
586function validateInputUnbindListener(parentElement){
587    $("#" + parentElement + ' input[data-validate]').unbind('change blur');
588}
589
590function validateSelectListener(parentElement){
591    $("#" + parentElement + ' select[data-validate]').on('change', function (){
592        var newValue = $(this).val()
593        var oldValue = $(this).data('validate-old-val')
594        if (oldValue === null || oldValue === ''){
595            oldValue = newValue
596            $(this).data('validate-old-val', newValue)
597        }
598
599        if (newValue !== oldValue || oldValue === undefined){
600            processValidation($(this), parentElement)
601            $(this).data('validate-old-val', newValue)
602        }
603
604        if (($('#'+parentElement+' .input-feedback-error').length == 0 || $('#'+parentElement).data('valid') == true)){
605            $('#'+parentElement).find('button[type="submit"]').prop('disabled', false).removeClass('disabled')
606        } else {
607            $('#'+parentElement).find('button[type="submit"]').prop('disabled', true).addClass('disabled')
608        }
609    })
610}
611
612function validateSelectUnbindListener(parentElement){
613    $("#" + parentElement + ' select[data-validate]').unbind('change')
614}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.