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(' ').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.