PageSourceSearch

https://www.woven.is/blog/js/jquery.adrecom.form.valid.js?v=2026

js woven.is collected 2026-09-29 09:09:16 UTC 15,231 bytes, 383 lines download raw bytes

1function luhn_check(number) {
2    if (number=='4222222222222222') //Work around for Auth.net test card
3        return true;
4
5    // Strip any non-digits (useful for credit card numbers with spaces and hyphens)
6    var number=number.replace(/\D/g, '');
7
8    // Set the string length and parity
9    var number_length=number.length;
10    var parity=number_length % 2;
11
12    // Loop through each digit and do the maths
13    var total=0;
14    for (i=0; i < number_length; i++) {
15        var digit=number.charAt(i);
16        // Multiply alternate digits by two
17        if (i % 2 == parity) {
18            digit=digit * 2;
19            // If the sum is two digits, add them together (in effect)
20            if (digit > 9) {
21                digit=digit - 9;
22            }
23        }
24        // Total up the digits
25        total = total + parseInt(digit);
26    }
27
28    // If the total mod 10 equals 0, the number is valid
29    if (total % 10 == 0)
30        return true;
31    return false;
32
33}
34
35
36function isValidCreditCard(type, ccnum) {
37    if (!type)
38        type = 'VISA';
39    re = '';
40    if (type == "VISA") {
41        if (ccnum=='4222222222222222') //Work around for Auth.net test card
42            return true;
43        // Visa: length 16, prefix 4, dashes optional.
44        var re = /^4\d{3}-?\d{4}-?\d{4}-?\d{4}$/;
45    } else if (type == "MASTERCARD") {
46        // Mastercard: length 16, prefix 51-55, dashes optional.
47        var re = /^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/;
48    } else if (type == "ISRACARD") {
49        // Isracard: length 8-9, no known prefix, dashes optional.
50        var re = /^\d{0,1}-?\d{4}-?\d{4}$/;
51    } else if (type == "DISCOVER") {
52        // Discover: length 16, prefix 6011, dashes optional.
53        var re = /^6011-?\d{4}-?\d{4}-?\d{4}$/;
54    } else if (type == "AMEX") {
55        // American Express: length 15, prefix 34 or 37.
56        var re = /^3[4,7]\d{13}$/;
57    } else if (type == "DINERS") {
58        // Diners: length 14, prefix 30, 36, or 38.
59        var re = /^3[0,6,8]\d{12}$/;
60    } else if (type == "JCB") {
61        // JCB: length 16, prefix 35 , dashes optional.
62        var re = /^35-?\d{4}-?\d{4}-?\d{4}$/;;
63    }
64    if (re=='' || ccnum=='')
65        return false;
66    if (!re.test(ccnum)) return false;
67    if (type == "ISRACARD")
68        return true;
69    // Remove all dashes for the checksum checks to eliminate negative numbers
70    ccnum = ccnum.split("-").join("");
71    // Checksum ("Mod 10")
72    // Add even digits in even length strings or odd digits in odd length strings.
73    var checksum = 0;
74    for (var i=(2-(ccnum.length % 2)); i<=ccnum.length; i+=2) {
75        checksum += parseInt(ccnum.charAt(i-1));
76    }
77
78    // Analyze odd digits in even length strings or even digits in odd length strings.
79    for (var i=(ccnum.length % 2) + 1; i<ccnum.length; i+=2) {
80        var digit = parseInt(ccnum.charAt(i-1)) * 2;
81        if (digit < 10) { checksum += digit; } else { checksum += (digit-9); }
82    }
83    if ((checksum % 10) == 0) return true; else return false;
84}
85
86function validate_any_form(frm, filter_selector) {
87
88    var $form = $(frm);
89    var $fields_scope = $form;
90    if (filter_selector){
91        $fields_scope = $form.find(filter_selector);
92        if (!$fields_scope.length){
93            alert('Fatal error: wrong validation filter!');
94            return false;
95        }
96
97    }
98    var $err_message_block = get_error_message_block();
99
100    var $mandatory_fields = $();
101
102    var $validation_passed = true;
103
104
105    function get_error_message_block(){
106        var $res = $form.find('.form_err_message');
107        if ($res.length) return $res;
108        $form.prepend('<div class="form_err_message error_message hidden"></div>');
109        return $form.find('.form_err_message');
110    }
111
112    function get_spec_error_message_block(error_class_name){
113        var $res = $err_message_block.find('.'+error_class_name);
114        if ($res.length) return $res;
115        $err_message_block.append('<span class="'+error_class_name+' hidden"></span>');
116        return $err_message_block.find('.'+error_class_name);
117    }
118
119
120    function clean_up_mandatory_selected(){
121        $form.find('iframe.mandatory_selected').contents().find('body').removeClass('mandatory_selected');
122        $form.find('input, select, textarea, label, iframe').removeClass('mandatory_selected');
123        $form.find('.has-error').removeClass('has-error');
124        $err_message_block.find('.checkbox_mandatory_error, .form_email_error, .form_currency_error').hide().addClass('hidden');
125        $err_message_block.find('.form_password_error, .form_mandatory_error, .form_mandatory_maxlength_error, .validate_terms_error').hide().addClass('hidden');
126        $err_message_block.find('.form_mandatory_maxlength_error, .form_cc_error, .form_emails_match_error').hide().addClass('hidden');
127        $err_message_block.hide().addClass('hidden');
128    }
129
130    function highlight_error(error_class_name, msg, $items2hightlight){
131        if (!$items2hightlight.length) return;
132        $validation_passed = false;
133        $err_message_block.show().removeClass('hidden');
134        var $specific_error_block = get_spec_error_message_block(error_class_name);
135        $specific_error_block.show().removeClass('hidden');
136        if ($specific_error_block.html()==''){
137            $specific_error_block.html(msg);
138        }
139        $items2hightlight.addClass('mandatory_selected');
140
141        // Bootstrap validation states:
142        var group = $items2hightlight.closest('.form-group, .checkbox, .radio');
143        group.addClass('has-error');
144    }
145
146    function make_captcha_mandatory(){
147        $form.find('input[name="FORM_VALIDATOR"]').addClass('mandatory');
148    }
149
150    function validate_email(val){
151        var email_filter = /^(([^<>()\[\]\\.,;:\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,}))$/;
152        return email_filter.test(val);
153    }
154
155    function validate_currency(val){
156      return Number(val).toFixed(2) == val;
157    }
158
159    function validate_field_name(val){
160        var field_filter = /^([A-Z0-9_]*)$/;
161        return field_filter.test(val);
162    }
163
164
165    function validate_max_length(val, $obj){
166        var min_length = $obj.attr('minlength');
167        if (!min_length) min_length = $obj.data('min_length')
168        if (!min_length) return true;
169        return $.trim(val).length >= min_length;
170    }
171
172
173
174
175    function validate_values(selector2validate, valid_func){
176        var $res = $();
177        var $items2validate = $fields_scope.find(selector2validate);
178        if (!$items2validate.length) return $res;
179        $items2validate.each(function() {
180            var $t = $(this);
181            var val = $t.val();
182            if (val == '' || valid_func(val, $t)) return;
183            $res = $res.add($t);
184        });
185        return $res;
186    }
187
188    function validate_passwords(){
189        var $res = $();
190        var $form = $fields_scope;
191        if ($form.find('input[type=password]').length < 2) return $res;
192        var $p1 = $form.find('input#PASSWORD1, input.password1');
193        var $p2 = $form.find('input#PASSWORD2, input.password2');
194        if (!$p1.length && !$p2.length){
195            $p1 = $form.find('input[type=password]:first');
196            $p2 = $form.find('input[type=password]:last');
197        }
198        if ($p1.length && $p2.length && ($p1.val()==$p2.val())) return $res;
199        return $res.add($p1).add($p2);
200    }
201
202    function validate_emails(){
203        var $res = $();
204        var $form = $fields_scope;
205        if ($form.find('.mail').length < 2) return $res;
206        var $m1 = $form.find('input.mail:first, input.mail1');
207        var $m2 = $form.find('input.mail_confirm, input.mail2');
208        if (!($m1.length && $m2.length)) return $res;
209        if ($m1.val()==$m2.val()) return $res;
210        return $res.add($m1).add($m2);
211    }
212
213
214    function get_object_or_labels($obj){
215        var $form = $fields_scope;
216        var $l = $form.find('label[for="' + $obj.attr('id') + '"]');
217        return $l.length?$l:$obj;
218    }
219
220    function validate_checkboxes(){
221        var $res = $();
222        var $form = $fields_scope;
223        var $checkboxes2validate = $form.find('input[type=checkbox].mandatory');
224        if (!$checkboxes2validate.length) return $res;
225        $checkboxes2validate.each(function(i, obj) {
226            if ($(obj).is(':checked')) return;
227            $res = $res.add(get_object_or_labels($(obj)));
228        });
229        return $res;
230    }
231
232    function validate_terms(){
233        var $res = $();
234        var $form = $fields_scope;
235        var $checkboxes2validate = $form.find('input[type=checkbox].mandatory-must-agree');
236        if (!$checkboxes2validate.length) return $res;
237        $checkboxes2validate.each(function(i, obj) {
238            if ($(obj).is(':checked')) return;
239            $res = $res.add(get_object_or_labels($(obj)));
240        });
241        return $res;
242    }
243
244    function validate_cc_number(){
245        var $form = $fields_scope;
246        var $cc_field = $form.find('input#CC_NUMBER.mandatory, input.credit_card_field');
247        var $tt_field = $form.find('select#CC_TYPE, .credit_card_type_selector');
248        if (!$cc_field.length) return $();
249        if (!$tt_field.length) return $cc_field;
250        var cc_v = $cc_field.val();
251        var cc_t = $tt_field.val();
252        if (!isValidCreditCard(cc_t, cc_v) || (cc_t != 'ISRACARD' && !luhn_check(cc_v)))
253            return $cc_field;
254        return $();
255    }
256
257    function validate_mandatory_radio_buttons(){
258        var $form = $fields_scope;
259        var $mandatory_radio_buttons = $form.find('input[type=radio].mandatory');
260        if (!$mandatory_radio_buttons.length) return;
261        var radioNames = {};
262        $form.find('input[type=radio].mandatory').each(function(i, obj) {
263            radioNames[$(obj).attr('name')] = 1;
264        });
265        $.each(radioNames, function(key, value) {
266            var $radioFields = $mandatory_radio_buttons.filter('[name="' + key + '"]');
267            if ($radioFields.filter(':checked').length) return;
268            $radioFields.each(function(idx, obj) {
269                $mandatory_fields = $mandatory_fields.add(get_object_or_labels($(obj)));
270                $mandatory_fields = $mandatory_fields.add($(obj));
271            });
272        });
273    }
274
275    function validate_all_inputs_but_radio_and_checkboxes(){
276        var $form = $fields_scope;
277        var $field2validate = $form.find('input.mandatory[type!=checkbox][type!=radio], select.mandatory, textarea.mandatory');
278        if (!$field2validate.length) return;
279        var $fields2add = $field2validate.filter(function() { return $(this).val() == ''});
280        if (!$fields2add.length) return;
281        $mandatory_fields = $mandatory_fields.add($fields2add);
282    }
283
284
285
286
287
288    clean_up_mandatory_selected();
289    make_captcha_mandatory();
290
291    highlight_error('form_email_error', 'Value entered for email is invali
291d', validate_values('input.mail, input#EMAIL', validate_email));
292    highlight_error('form_currency_error', 'Wrong number format for currency field(s)', validate_values('input.currency', validate_currency));
293    highlight_error('form_invalid_characters_error', 'Invalid characters found', validate_values('input.field_compliant', validate_field_name));
294    highlight_error('form_mandatory_maxlength_error', 'Entered text is too short', validate_values('input.mandatory[type!=checkbox][type!=radio], textarea', validate_max_length));
295    highlight_error('form_password_error', 'Passwords do not match, please try again...', validate_passwords());
296    highlight_error('form_emails_match_error', 'Emails do not match', validate_emails());
297    highlight_error('checkbox_mandatory_error', 'Check the mandatory checkbox(es) below', validate_checkboxes());
298    highlight_error('validate_terms_error', 'You should confirm that you\'ve read the terms and conditions', validate_terms());
299    highlight_error('form_cc_error', 'Entered card number is invalid', validate_cc_number());
300
301    //Backward compatibility:
302    highlight_error('on_focus_replace_error', 'on_focus_replace is depricated!', $fields_scope.find('input.on_focus_replace, textarea.on_focus_replace'));
303
304
305    //Following functions fill in $mandatory_fields
306    validate_mandatory_radio_buttons();
307    validate_all_inputs_but_radio_and_checkboxes();
308    validate_all_inputs_but_radio_and_checkboxes();
309
310
311    highlight_error('form_mandatory_error', 'Please fill in missing fields below', $mandatory_fields);
312
313
314    //var $mandatory_textareas = $form.find('textarea.mandatory');
315
316
317   /* $mandatory_textareas.each(function(i, obj) {
318
319        var $textarea = $(obj);
320        var val1 = $textarea.val();
321        var val2 = $.trim($textarea.val());
322        if (val2.length > 0 || val1 == val2)
323            return;
324        $textarea.val(val2);
325        if ($textarea.hasClass('editorBBCODE') && $textarea.data('bbcode_settings').editorVisible) {
326            $textarea.data('bbcode_settings').content = $textarea.val();
327            $textarea.bbcode2html();
328            $('#rte_' + $textarea.attr('id')).contents().find('body').html($textarea.data('bbcode_settings').content);
329        }
330    });
331
332    $form.find('textarea.mandatory_selected.editorBBCODE').each(function(i, obj) {
333    var parent = $(obj).parents('*').get(0);
334    $(parent).find('iframe.frm_editorBBCODE').addClass('mandatory_selected');
335    $(parent).find('iframe.frm_editorBBCODE').contents().find('body').addClass('mandatory_selected');
336    });
337    */
338
339    if ($validation_passed){
340        //following is a patch for BO
341        $form.find('select#REL_DST_SELECT').each(function() {
342            $('#REL_DST_SELECT option').attr('selected', 'selected');
343        });
344        return true;
345    }
346
347    $fields_scope.find('.mandatory_selected:first').focus();
348    return false;
349}
350
351function init_form_validation() {
352    var $forms2validate = $('form:has(input.mandatory), form:has(select.mandatory), form:has(textarea.mandatory)');
353    if (!$forms2validate.length)
354        return;
355
356    $('input.currency').blur(function() {
357        var $t = $(this);
358        var v = $t.val();
359        if ((v != '') && (Number(v).toFixed(2) != '0.00') && (Number(v).toFixed(2) != 'NaN'))
360            $t.val(Number(v).toFixed(2));
361    });
362
363    $forms2validate.submit(function(e) {
364        if ($(this).hasClass('js_skip_default_validation'))
365            return;
366        let res = validate_any_form(this);
367        if (!res){
368            e.preventDefault();
369            e.stopPropagation();
370            return false;
371        }
372        return true;
373    });
374
375    //Following is another patch for BO:
376    $('td.form_title + td.form_field:has(input.mandatory)').prev().find('span').text('*').css('color', 'red');
377    $('td.form_title + :not(td.form_field:has(input.mandatory))').prev().find('span').html('&nbsp; ').css('padding-left', '2px');
378}
379
380
381$(function() {
382  init_form_validation();
383});

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.