1/************ field types ************/ 2 function fc_base(elem, mandatory){ 3 var F = this, 4 field = elem, 5 state = false, 6 field = elem['field'], 7 target = elem['target'] || elem['field'], 8 value = elem['value'], 9 mandatory = mandatory || false; 10 11 F.getField = function(){ return field; } 12 F.getValue = function(){ return value; } 13 F.getTarget = function(){ return target; } 14 F.getState = function(){ return state; } 15 16 F.check = function(){ 17 var result = state; 18 19 if(!mandatory && value == ''){ 20 result = true 21 } else { 22 // var regex = new RegExp(/^.+$/); // any character except terminators (\n). 23 var regex = new RegExp(/^[\s\S]+$/); // fix für textarea 24 25 result = regex.test(value) ? true : false; 26 } 27 28 state = result; 29 return state; 30 } 31 } 32 33 function fc_mail(elem, mandatory){ 34 var F = this, 35 field = elem, 36 field = elem['field'], 37 target = elem['target'] || elem['field'], 38 value = elem['value'], 39 state = false, 40 mandatory = mandatory || false; 41 42 F.getField = function(){ return field; } 43 F.getValue = function(){ return value; } 44 F.getTarget = function(){ return target; } 45 F.getState = function(){ return state; } 46 47 F.check = function(){ 48 var result = state; 49 50 if(!mandatory && value == ''){ 51 result = true 52 } else { 53 var regex = new RegExp(/^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/); 54 55 result = regex.test(value) ? true : false; 56 } 57 58 state = result; 59 return state; 60 } 61 } 62 63 function fc_tel(elem, mandatory){ 64 var F = this, 65 field = elem['field'], 66 target = elem['target'] || elem['field'], 67 value = elem['value'], 68 state = false, 69 mandatory = mandatory || false; 70 71 F.getField = function(){ return field; } 72 F.getValue = function(){ return value; } 73 F.getTarget = function(){ return target; } 74 F.getState = function(){ return state; } 75 76 F.check = function(){ 77 var result = state; 78 79 if(!mandatory && value == ''){ 80 result = true 81 } else { 82 var regex = new RegExp("^((\\+|00)[1-9]\\d{0,3}|0 ?[1-9]|\\(00? ?[1-9][\\d ]*\\))[\\d\\-/ ]*$"); 83 84 result = regex.test(value) ? true : false; 85 } 86 87 state = result; 88 return state; 89 } 90 } 91 92 function fc_num(elem, mandatory){ 93 var F = this, 94 field = elem['field'], 95 value = elem['value'], 96 target = elem['target'] || elem['field'], 97 state = false, 98 mandatory = mandatory || false; 99 100 F.getField = function(){ return field; } 101 F.getValue = function(){ return value; } 102 F.getTarget = function(){ return target; } 103 F.getState = function(){ return state; } 104 105 F.check = function(){ 106 var result = state; 107 108 if(!mandatory && value == ""){ 109 result = true 110 } else { 111 var regex = new RegExp(/^\d+$/); 112 113 result = regex.test(value) ? true : false; 114 } 115 116 state = result; 117 return state; 118 } 119 } 120 121 function fc_date(elem, mandatory){ 122 var F = this, 123 field = elem['field'], 124 value = elem['value'], 125 target = elem['target'] || elem['field'], 126 state = false, 127 mandatory = mandatory || false; 128 129 F.getField = function(){ return field; } 130 F.getValue = function(){ return value; } 131 F.getTarget = function(){ return target; } 132 F.getState = function(){ return state; } 133 134 F.check = function(){ 135 var result = state; 136 137 if(!mandatory && value == ""){ 138 result = true 139 } else { 140 var regex = new RegExp(/^\d{1,2}\.\d{1,2}\.\d{4}$/); 141 142 result = regex.test(value) ? true : false; 143 } 144 145 state = result; 146 return state; 147 } 148 } 149 150 function fc_regex(elem, mandatory){ 151 var F = this, 152 field = elem['field'], 153 value = elem['value'], 154 target = elem['target'] || elem['field'], 155 state = false, 156 mandatory = mandatory || false, 157 regexrule = field.dataset.regex; 158 159 F.getField = function(){ return field; } 160 F.getValue = function(){ return value; } 161 F.getTarget = function(){ return target; } 162 F.getState = function(){ return state; } 163 164 F.check = function(){ 165 var result = state; 166 167 if(!mandatory && value == ""){ 168 result = true 169 } else { 170 var regex = new RegExp(regexrule); 171 172 result = regex.test(value) ? true : false; 173 } 174 175 state = result; 176 return state; 177 } 178 } 179 180 181/************ formcheck ************/ 182 function Formcheck(element, callbacks){ 183 if(typeof element != 'string') throw new Error("No valid form selector passed to formcheck"); 184 185 /********************************* private *************************************/ 186 var F = this, 187 _form = document.querySelector(element), 188 _fields = [], 189 _callbacks = { 190 'beforeValidation': null, 191 'afterValidation': null, 192 'onSuccess': null, 193 'onError': null 194 }; 195 196 if(_form == null) throw new Error("Form selector " + String(element) + " could not be found"); 197 if(typeof callbacks == 'object') _setupCallbacks(callbacks); 198 199 200 function _setClass(elem, classToSet){ 201 function __setClass(e){ 202 var classes = e.getAttribute('class') || ''; 203 204 if(classes.indexOf(classToSet) == -1) e.setAttribute('class', classes + " " + classToSet) 205 } 206 207 if(Array.isArray(elem)){ 208 elem.map(__setClass); 209 } else { 210 __setClass(elem) 211 } 212 } 213 214 function _removeClass(elem, classToRemove){ 215 function __removeClass(e){ 216 var classes = e.getAttribute('class') || ''; 217 218 if(classes.indexOf(classToRemove) != -1) e.setAttribute('class', classes.replace(" " + classToRemove, "")) 219 } 220 221 if(Array.isArray(elem)){ 222 elem.map(__removeClass); 223 } else { 224 __removeClass(elem) 225 } 226 } 227 228 function _loadFields(fc_serialize_result){ 229 _fields = []; 230 temp_fields = fc_serialize_result || fc_serialize(_form); 231 232 try { 233 for(var index = 0; index < temp_fields.length; index++){ 234 var field = temp_fields[index], 235 is_mandatory = field['class'].indexOf('input_must') == -1 ? false : true, 236 match = field['class'].match(/fc_\S+/), 237 temp_instance = false; 238 239 if(match){ 240 temp_instance = new window[match[0]](temp_fields[index], is_mandatory); 241 } else { 242 temp_instance = new window['fc_base'](temp_fields[index], is_mandatory); 243 } 244 245 if(temp_instance) _fields.push(temp_instance); 246 } 247 } catch(e){ 248 console.log("temp_fields variable: ", temp_fields, e); 249 throw new Error("_loadFields failed:"); 250 } 251 } 252 253 function _simplifyFormData(fc_serialize_result){ 254 if(!Array.isArray(fc_serialize_result)) throw new Error("fc_serialize_result should be an array"); 255 256 var form_data = {}; 257 258 fc_serialize_result.map(function(e,i){ 259 form_data[e.name] = e.value; 260 }); 261 262 return form_data; 263 } 264 265 function _checkForm(e, bPreventCallbacks = false){ 266 e.preventDefault();
267 if(typeof _callbacks['beforeValidation'] == 'function') _callbacks['beforeValidation'](); 268 269 var form_is_valid = true, 270 fc_serialize_result = fc_serialize(_form); 271 272 _loadFields(fc_serialize_result); 273 274 for(var index = 0; index < _fields.length; index++){ 275 try { 276 var current_field = _fields[index], 277 result = current_field.check(), 278 target = current_field.getTarget(), 279 field = current_field.getField(); 280 281 if(result){ 282 _removeClass(target, 'input_false'); 283 } else { 284 _setClass(target, 'input_false'); 285 form_is_valid = false; 286 287 // Make sure to have an array of fields 288 let fieldArray = Array.isArray(field) ? field : [field]; 289 290 fieldArray.forEach(singleField => { 291 singleField.addEventListener("blur", () => { 292 _checkForm(e, true); 293 },{ once: true }); 294 }); 295 } 296 } catch(e){ 297 throw new Error(`field instance index ${index} - Error-Message: ${e}`); 298 } 299 } 300 301 if(!bPreventCallbacks){ 302 if(typeof _callbacks['afterValidation'] == 'function') _callbacks['afterValidation'](fc_serialize_result); 303 304 var form_data = _simplifyFormData(fc_serialize_result); 305
306 if(!form_is_valid && typeof _callbacks['onError'] == 'function') _callbacks['onError'](form_data); 307 if(form_is_valid && typeof _callbacks['onSuccess'] == 'function') _callbacks['onSuccess'](form_data); 308 } 309 310 return form_is_valid; 311 } 312 313 function _setupCallbacks(setup){ 314 Object.assign(_callbacks, setup); 315 } 316 317 318 /********************************* public *************************************/ 319 320 F.dump = function(){ 321 var fc_serialize_result = fc_serialize(_form); 322 _loadFields(fc_serialize_result); 323 324 for(var index = 0; index < _fields.length; index++){ 325 fc_serialize_result[index]['valid'] = _fields[index].check(); 326 fc_serialize_result[index]['instance'] = _fields[index]; 327 } 328 329 return fc_serialize_result; 330 } 331 332 F.update = function(setup){ 333 _setupCallbacks(setup); 334 } 335 336 337 /********************************* events *************************************/ 338 339 _form.addEventListener('submit', _checkForm); 340 } 341 342 343/************ serialize form ************/ 344 function fc_serialize(form){ 345 var serialized = [], 346 radio_checkbox_set = {}; 347 348 function onlyUnique(value, index, self){ 349 return self.indexOf(value) === index; 350 } 351 352 function getCustomAttributes(field){ 353 // var attributes = Array.from(field.attributes), 354 var attributes = [].slice.call(field.attributes), 355 result = {}; 356 357 for(var index = 0; index < attributes.length; index++){ 358 var elem = attributes[index]; 359 360 if(elem.name.indexOf('fc-') != -1){ 361 var key = elem.name.replace('data-fc-','').replace('fc-',''); 362 363 if(key == 'target'){ 364 if(elem.value == 'p' || elem.value == 'parent'){ 365 result[key] = field.parentNode; 366 continue; 367 } 368 369 // var elements = Array.from(document.querySelectorAll(elem.value)); 370 var elements = [].slice.call(document.querySelectorAll(elem.value)); 371 if(elements.length == 0) throw new Error("Target selector " + elem.value + " could not be found"); 372 373 result[key] = elements.length == 1 ? elements[0] : elements; 374 } else { 375 result[key] = elem.value; 376 } 377 } 378 } 379 380 return result; 381 } 382 383 function createEntry(p_name, p_value, p_field, p_class, p_other){ 384 var result = { 385 'name': p_name, 386 'value': p_value, 387 'field': p_field, 388 'class': p_class 389 }; 390 391 if(typeof p_other == 'object') result = Object.assign(result, p_other); 392 393 return result; 394 } 395 396 for(var i = 0; i < form.elements.length; i++){ 397 var field = form.elements[i]; 398 399 if(!field.name || field.disabled || field.type === 'file' || field.type === 'reset' || field.type === 'submit' || field.type === 'button') continue; 400 401 if(field.type === 'select-multiple'){ 402 for(var n = 0; n < field.options.length; n++){ 403 if (!field.options[n].selected) continue; 404 405 var new_entry = createEntry(field.name, field.value, field, field.getAttribute("class") || "", getCustomAttributes(field)); 406 407 serialized.push(new_entry); 408 } 409 } else if(field.type !== 'checkbox' && field.type !== 'radio'){ 410 var new_entry = createEntry(field.name, field.value, field, field.getAttribute("class") || "", getCustomAttributes(field)); 411 412 serialized.push(new_entry); 413 } else if(field.type == 'checkbox' || field.type == 'radio'){ 414 radio_checkbox_set[field.name] = form["elements"][field.name] 415 } 416 } 417 418 var radio_checkbox_keys = Object.keys(radio_checkbox_set); 419 420 for(var i = 0; i < radio_checkbox_keys.length; i++){ 421 var element = radio_checkbox_keys[i], 422 // fields = Array.from(radio_checkbox_set[element]), 423 fields = [].slice.call(radio_checkbox_set[element]), 424 values = [], 425 classes = [], 426 special_attr = {}; 427 428 if(typeof radio_checkbox_set[element].length === 'undefined'){ 429 // Fix: [].slice.call returns an empty array, if only one element is found. 430 fields.push(radio_checkbox_set[element]); 431 } 432 433 for(var j = 0; j < fields.length; j++){ 434 var field = fields[j]; 435 if(field.checked) values.push(field.value); 436 Object.assign(special_attr, getCustomAttributes(field)); 437 438 var attr = field.getAttribute("class"); 439 if(attr) classes = classes.concat(attr.split(" ")); 440 } 441 442 if(classes.length > 0) classes = classes.filter(onlyUnique); 443 444 var new_entry = createEntry(element, values.join(","), fields, classes.join(" "), special_attr); 445 serialized.push(new_entry); 446 } 447 448 return serialized; 449 }
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.