1/* 2checkForm (version 3.3) by Riki "Fczbkk" Fridrich, 2003 - 2004 3http://www.fczbkk.com/, mailto:[email protected] 4 5Tento skript mozes volne pouzit a modifikovat bez povolenia. 6Budem rad, ak mi o tom das vediet, pripadne mi posles URL stranky, kde 7ho pouzivas. Ak sa ti podari ho nejako vylepsit, rozsirit alebo v nom 8najdes a opravis nejaku chybu, budem ti vdacny, ak ma o tom budes informovat. 9 10Aktualnu verziu tohto skriptu vzdy najdes na adrese: 11http://www.fczbkk.com/js/check_form/ 12 13Pozadovane kniznice: 14- dom http://www.fczbkk.com/js/dom/ 15 16Dakujem PPl za pomoc pri testovani, ladeni a hlavne za regExp-y pre e-mail a url. 17 18*/ 19 20checkForm = { 21 invalidMsg : "", 22 errorMsg : "\n- %err", 23 errors : [], 24 25 invalidClass : "invalid", 26 requiredClass : "required", 27 outsideInvalidClass : "outsideInvalid", 28 29 fieldType : [], 30 defaultValue : [], 31 32 extChckObj: {}, // jmeno objektu s externi testovaci funkci, ktera muze otestovat logicnost zadanych dat 33 34 // inicializacia skriptu 35 init : function () { 36 if (lang) { 37 switch (lang) { 38 case 'cz': 39 checkForm.invalidMsg = 'FormuláŠnenà vyplnÄn správnÄ.\n\nProsÃm opravte:%err'; 40 break; 41 case 'sk': 42 checkForm.invalidMsg = 'Formulár nie je správne vyplnený.\n\nProsÃm, opravte:%err'; 43 break; 44 case 'pl': 45 checkForm.invalidMsg = 'Przepraszamy, przed wysÅaniem należy wypeÅniÄ wymagane pola oznaczone gwiazdkÄ :%err'; 46 break; 47 case 'hu': 48 checkForm.invalidMsg = 'Elnézést, az adatok nem lettek elmentve, kérem a hiányzó mezÅk kitöltését:%err'; 49 break; 50 case 'at': 51 case 'de': 52 checkForm.invalidMsg = 'Das Formular wurde inkorrekt ausgefüllt\n\nBitte korrigieren Sie:%err'; 53 break; 54 case 'es': 55 checkForm.invalidMsg = 'Lo sentimos pero este registro no puede ser guardado antes que sean rellenados los datos obligatorios:%err'; 56 break; 57 case 'fr': 58 checkForm.invalidMsg = 'Remplissez le formulaire correctement, s\'il vous plaît:%err'; 59 break; 60 case 'lt': 61 checkForm.invalidMsg = 'Forma užpildyta neteisingai:%err'; 62 break; 63 case 'uk': 64 checkForm.invalidMsg = 'ÐнкеÑа заполнена непÑавилÑно.\n\nÐÑоÑÑба иÑпÑавиÑÑ:%err'; 65 break; 66 case 'ru': 67 checkForm.invalidMsg = 'ÑоÑма бÑла вÑполнена непÑавилÑно:%err'; 68 break; 69 default: 70 checkForm.invalidMsg = 'The form was not filled in correctly\n\nPlease, correct:%err'; 71 } 72 } else { 73 checkForm.invalidMsg = '%err'; 74 } 75 76 // ak mame k dispozicii kniznice evt a cls a browser je standards-compliant, mozeme zacat 77 if (evt && cls && document.getElementById) { 78 // prejdeme vsetky formulare a najdeme v nich vsetky fieldy, zavesime potrebne eventy 79 var forms = document.getElementsByTagName("form"); 80 for (var i = 0; i < forms.length; i++) { 81 evt.add(forms[i], "submit", checkForm.checkForm); 82 evt.add(forms[i], "reset", checkForm.checkForm); 83 84 var fields = checkForm.getFields(forms[i]); 85 for (var j = 0; j < fields.length; j++) { 86 evt.add(fields[j], "blur", checkForm.checkField); 87 evt.add(fields[j], "focus", checkForm.checkField); 88 evt.add(fields[j], "change", checkForm.checkField); 89 // kontrola pri onkeyup sposobuje problemy s nepristupnostou policka v niektorych prehliadacoch, ak obsahuje nespravnu hodnotu 90 /* 91 if ((fields[j].tagName.toLowerCase() == "input") && ((fields[j].type == "text") || (fields[j].type == "password"))) { 92 evt.add(fields[j], "keyup", checkForm.checkField); 93 } 94 */ 95 } 96 97 checkForm.checkForm(forms[i]); 98 } 99 return true; 100 } 101 return false;
102 }, 103 104 // vrati pole obsahujuce vsetky polia, ktore budeme kontrolovat 105 getFields : function(frm) { 106 if (frm && frm.getElementsByTagName) { 107 var fields = []; 108 109 var inputs = frm.getElementsByTagName("input"); 110 for (var i = 0; i < inputs.length; i++) { 111 if ( 112 inputs[i].type == "text" || 113 inputs[i].type == "hidden" || 114 inputs[i].type == "password" || 115 inputs[i].type == "file" 116 ) { 117 fields[fields.length] = inputs[i]; 118 } 119 } 120 121 var textareas = frm.getElementsByTagName("textarea"); 122 for (var i = 0; i < textareas.length; i++) { 123 fields[fields.length] = textareas[i]; 124 } 125 126 var selects = frm.getElementsByTagName("select"); 127 for (var i = 0; i < selects.length; i++) { 128 fields[fields.length] = selects[i]; 129 } 130 return fields; 131 } 132 return false; 133 }, 134 135 // proveri validitu vsech policek a povoli nebo nepovoli submit 136 checkForm : function(frm) { 137 if (!frm || !frm.tagName || frm.tagName.toLowerCase() != "form") { 138 e = evt.fix(frm); 139 frm = e.target; 140 } else { 141 var e = false; 142 } 143 144 checkForm.errors = []; 145 146 var fields = checkForm.getFields(frm); 147 var fieldsOK = true; 148 149 for (var i = 0; i < fields.length; i++) { 150 fieldsOK = ((checkForm.checkField(fields[i]) == "valid") && fieldsOK) ? true : false; 151 } 152 153 // validita radio a checkboxu 154 fieldsOK = checkForm.checkPickFields(frm) && fieldsOK; 155 156 var formName = (typeof frm.attributes['name'] == 'undefined') ? null : (frm.attributes['name'] == null ? null: frm.attributes['name'].nodeValue); 157 if (fieldsOK) { 158 if (typeof checkForm.extChckObj[formName] != 'undefined' && checkForm.extChckObj[formName].init) { // pokud probehl init formulare, muze dojit k jeho otestovani 159 eval('var chckObj = ' + checkForm.extChckObj[formName].chck_function +';'); 160 if (chckObj.chckFrm(frm)) { 161 return true; 162 } else { 163 if (e.preventDefault) { 164 e.preventDefault(); 165 } 166 } 167 } else { 168 if (typeof checkForm.extChckObj[formName] != 'undefined' && !checkForm.extChckObj[formName].init) checkForm.extChckObj[formName].init = true; // nastavit priznak probehnuteho initu formulare 169 return true; 170 } 171 } else { 172 if (e && (e.type == "reset")) { 173 return; 174 } 175 if (e && (e.type == "submit")) { 176 var err = ""; 177 for (var i = 0; i < checkForm.errors.length; i++) { 178 err += checkForm.errorMsg.replace("%err", checkForm.errors[i]); 179 } 180 alert(checkForm.invalidMsg.replace("%err", err)); 181 if (e.preventDefault) { 182 e.preventDefault(); 183 } 184 } 185 } 186 if (typeof checkForm.extChckObj[formName] != 'undefined' && !checkForm.extChckObj[formName].init) checkForm.extChckObj[formName].init = true; // nastavit priznak probehnuteho initu formulare 187 188 return false; 189 }, 190 191 // preveri validitu policka a vrati "valid" alebo "invalid" 192 checkField : function(elm) { 193 194 if (!elm || !elm.tagName) { 195 var e = evt.fix(elm); 196 elm = e.target; 197 } 198 199 if ( 200 elm && 201 ( 202 (elm.tagName.toLowerCase() == "input") || 203 (elm.tagName.toLowerCase() == "select") || 204 (elm.tagName.toLowerCase() == "textarea") 205 ) 206 ) { 207 var fieldOK = true; 208 var outsideValidationOK = true; 209 var elmClasses = cls.get(elm); 210 211 // proiteruje jen elementy s tridou 212 for (var i = 0; i < elmClasses.length; i++) { 213 214 if (checkForm.fieldType[elmClasses[i]]) { 215 216 var rule = checkForm.fieldType[elmClasses[i]]; 217 if (fieldOK && typeof(rule) == "string") { 218 219 // pravidlo je string 220 if (elm.value != "") { 221 fieldOK = (elm.value.search(new RegExp("^([" + rule + "]){1,}$")) < 0) ? false : true; 222 } 223 224 } else if (fieldOK && ((typeof(rule) == "function") || (typeof(rule) == "object")) && rule.source) { 225 // Mozilla vracia RegExpu typ "function", zatial co ostatne browsery "object" 226 227 // pravidlo je regExp 228 if (elm.value != "") { 229 fieldOK = (elm.value.search(rule) < 0) ? false : true; 230 } 231 232 } else if (fieldOK && (typeof(rule) == "function") && rule.prototype) { 233 234 // pravidlo je funkcia 235 fieldOK = rule(e, elm); 236 237 } 238 } 239 240 /* default value 241 if (e && checkForm.defaultValue[elmClasses[i]]) { 242 var val = checkForm.defaultValue[elmClasses[i]]; 243 if ((e.type == "focus") && (elm.value == "")) { 244 elm.value = val; 245 } 246 if ((e.type == "blur") && (elm.value == val)) { 247 elm.value = ""; 248 } 249 } 250 */ 251 } 252 253 254 var outsideValidationOK = !cls.has(elm, checkForm.outsideInvalidClass); 255 256 257 if (fieldOK && outsideValidationOK) { 258 cls.remove(elm, "invalid"); 259 } else { 260 cls.add(elm, "invalid"); 261 checkForm.errors[checkForm.errors.length] = checkForm.getFieldErrorMsg(elm); 262 //(elm.checkFormErr) ? elm.checkFormErr : (elm.title) ? elm.title : (elm.name) ? elm.name : elm.toString(); 263 } 264 265 return (fieldOK && outsideValidationOK) ? "valid" : "invali
265d"; 266 } 267 return false; 268 }, 269 270 // proveri validitu policek typu radio a checkbox a vrati "valid" nebo "invalid" 271 checkPickFields : function(frm) { 272 var result = true; 273 if (frm && frm.getElementsByTagName) { 274 var fields = []; 275 var requireds = {}; 276 277 // nacteni 278 var inputs = frm.getElementsByTagName("input"); 279 280 for (var i = 0; i < inputs.length; i++) { 281 var elm = inputs[i]; 282 283 if (elm.type == "radio" || elm.type == "checkbox") { 284 var elmClasses = cls.get(elm); 285 for (var j = 0; j < elmClasses.length; j++) { 286 if (elmClasses[j] != 'required') continue; 287 fields[fields.length] = elm; 288 var title = elm.name; 289 if (elm.title) { 290 title = elm.title; 291 } 292 requireds[elm.name] = [false, title]; 293 } 294 } 295 } 296 297 // kontrola 298 if (fields.length) { 299 300 for(name in requireds) { 301 for (var i = 0; i < fields.length; i++) { 302 if (fields[i].name != name) continue; 303 if (fields[i].checked && !requireds[name][0]) { 304 requireds[name][0] = true; 305 break; 306 } 307 } 308 if (!requireds[name][0]) { 309 result = false;
310 checkForm.errors[checkForm.errors.length] = requireds[name][1]; 311 //break; 312 } 313 } 314 } 315 } 316 return result; 317 }, 318 319 // prida novy typ policka 320 addFieldType : function(cls, rule, defaultValue) { 321 if (cls && (rule || defaultValue)) { 322 if (rule) { 323 checkForm.fieldType[cls] = rule; 324 } 325 if (defaultValue) { 326 checkForm.defaultValue[cls] = defaultValue; 327 } 328 return true; 329 } 330 return false; 331 }, 332 333 getFieldErrorMsg : function(elm) { 334 if (elm) { 335 if (elm.checkFormErrorMsg) { 336 return elm.checkFormErrorMsg; 337 } 338 if (elm.title) { 339 return elm.title; 340 } 341 if (elm.id) { 342 var labels = document.getElementsByTagName("label"); 343 for (var i = 0; i < labels.length; i++) { 344 if (labels[i].attributes["for"] && (labels[i].attributes["for"].value == elm.id)) { 345 // Opera nezvlada atribut "for" 346 var str = checkForm.getNodeText(labels[i]); 347 return str; 348 } 349 } 350 return elm.id; 351 } 352 if (elm.name) { 353 return elm.name; 354 } 355 return elm.toString(); 356 } 357 return false; 358 }, 359 360 getNodeText : function(node) { 361 var str = ""; 362 if (node && node.hasChildNodes()) { 363 for (var i = 0; i < node.childNodes.length; i++) { 364 // TODO: skladanie toho stringu treba urobit nejak systemovejsie a prehladnejsie 365 str += (node.childNodes[i].nodeType == 3) ? node.childNodes[i].nodeValue : checkForm.getNodeText(node.childNodes[i]); 366 if ((node.childNodes[i].nodeType == 1) && (node.childNodes[i].tagName.toLowerCase() == "img") && (node.childNodes[i].attributes["alt"])) { 367 str += node.childNodes[i].attributes["alt"].value; 368 } 369 } 370 } 371 return str; 372 } 373 374} 375 376/* basic field types */ 377 378// required field 379checkForm.addFieldType( 380 "required", 381 function(evt, elm) { 382 if (elm) { 383 if (elm.tagName.toLowerCase() == "select") { 384 return elm.selectedIndex ? true : false; 385 } else { 386 return (elm.value.search(/\S/) < 0) ? false : true; 387 } 388 } 389 return false; 390 } 391); 392 393// numbers only 394checkForm.addFieldType( 395 "numbers", 396 "0123456789" 397); 398 399// float numbers 400checkForm.addFieldType( 401 "floatnumbers", 402 new RegExp("^[0-9]+[,\.]{0,1}[0-9]*$") 403); 404 405// IDs - numbers divided by space 406checkForm.addFieldType( 407 "ids", 408 new RegExp("^[0-9 ]{1,}$") 409); 410 411// safe characters (alphanumeric, numbers and underscore) 412checkForm.addFieldType( 413 "safeChars", 414 new RegExp("^[a-zA-Z0-9_]{1,}$") 415); 416 417// safe characters (alphanumeric, numbers, underscore, dash and point) 418checkForm.addFieldType( 419 "safeFilename", 420 new RegExp("^[a-z0-9_\.-]+$") 421); 422 423// date 424 425// jednoducha kontrola pomocou regExp 426/* 427checkForm.addFieldType( 428 "date", // in format (D)D.(M)M.YYYY 429 new RegExp("^[0-9]{1,2}[.][0-9]{1,2}[.][0-9]{4}$") 430); 431*/ 432 433// komplexnejsia kontrola pomocou funkcie (pocty dni v mesiaci, prestupne roky a pod.) 434checkForm.addFieldType( 435 "date", 436 function (evt, elm) { 437 if (!elm.value) {return true;} 438 439 var date_format = null; 440 if (elm.value.indexOf('.') != -1) { 441 var date_format = new RegExp("^[0-9]{1,2}[.][0-9]{1,2}[.][0-9]{4}$") 442 var date = elm.value.split("."); 443 444 } else if (elm.value.indexOf('-') != -1) { 445 var date_format = new RegExp("^[0-9]{4}[\-][0-9]{1,2}[\-][0-9]{1,2}$") 446 var date = elm.value.split("-"); 447 date.reverse(); 448 } 449 450 if (!date_format) { return false; } 451 if (!date_format.test(elm.value)) { return false; } 452 453 var day = date[0]; 454 var month = date[1]; 455 var year = date[2]; 456 if (!isNaN(day) && !isNaN(month) && !isNaN(year)) { 457 // mesiac 458 if ((month > 12) || (month < 1)) {return false;} 459 460 // dni 461 if (day < 1) {return false;} 462 463 var maxDays = 31; 464 if (month == 2) {maxDays = (year%4 == 0) ? 29 : 28;} // kontrola prestupneho roku 465 if ((month == 4) || (month == 6) || (month == 9) || (month == 11)) {maxDays = 30;} 466 467 if (day > maxDays) {return false;} 468 469 return true; 470 } 471 return false;
472 } 473); 474 475// URL 476checkForm.addFieldType( 477 "url", 478 new RegExp("^\\w+://(([\\w\\+\\.\\-]+\\b)(:\\w+)@)?([/\\w\\+\\.\\-]+\\b)(\/{1})?(\\?[\\w\\+\\.\\-/;\\&@=]+\\b)?(#[\\w\\-%]+\\b)?$"), 479 // protokol^ ^user password^ ^server konc. slash^ ^parametry (?) ^relativni odkaz (#) 480 //new RegExp("^[http|https|ftp]:\/\/[a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*\.[a-zA-Z]{2,4}(\/{1}[-_~&=\?\.a-z0-9]*)*$"), 481 "http://" 482); 483 484// e-mail 485checkForm.addFieldType( 486 "email", 487 new RegExp("^([\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\{\\}\\|\\~]+)((\\.){1}[\\w\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\{\\}\\|\\~]+)*@[\\w\\!\\#\\$\\%\\&\\*\\+\\-\\/\\=\\?\\^\\{\\}\\|\\~]+((\\.){1}[\\w\\!\\#\\$\\%\\&\\*\\+\\-\\/\\=\\?\\^\\{\\}\\|\\~]+)+$") 488 //new RegExp("^[a-z0-9]+[a-z0-9\._-]*[a-z0-9]+@[a-z0-9]+[a-z0-9\._-]*[a-z0-9]+\.[a-z]{2,4}$") 489 //new RegExp("^[a-zA-Z0-9]+[a-zA-Z0-9\._-]*[a-zA-Z0-9]+@[a-zA-Z0-9]+[a-zA-Z0-9\._-]*[a-zA-Z0-9]+\.[a-zA-Z]{2,4}$") 490); 491 492// zipcode 493checkForm.addFieldType( 494 "zipcode", 495 new RegExp("^[0-9]{3}( )*[0-9]{2}$") 496); 497 498// zipcode 499checkForm.addFieldType( 500 "zipcodeSpaces", 501 function (evt, elm) { 502 var v = elm.value; 503 if (!v) return true; 504 v = v.replace(/[ \t]/g, ''); 505 var format = new RegExp("^[0-9]{5}$"); 506 if (format.test(v)) { 507 return true; 508 } 509 return false; 510 } 511); 512 513// dic EU 514checkForm.addFieldType( 515 "dicEU", 516 function (evt, elm) { 517 var v = elm.value.replace(' ', ''); 518 if (!v) {return true;} 519 var dic = [ 520 '^ATU[0-9]{8}$', 521 '^BE[01][0-9]{9}$', 522 '^BG[0-9]{9,10}$', 523 '^CY[0-9]{8}[A-Z]$', 524 '^CZ[0-9]{8,10}$', 525 '^DE[0-9]{9}$', 526 '^DK[0-9]{2} [0-9]{2} [0-9]{2} [0-9]{2}$', 527 '^DK[0-9]{8}$', // pro jistotu, kdyby to Danove nepsali jen s mezerami (viz vyse) 528 '^EE[0-9]{9}$', 529 '^EL[0-9]{9}$', 530 '^ES[A-Z0-9][0-9]{8}$', '^ES[0-9]{8}[A-Z0-9]$', '^ES[A-Z][0-9]{7}[A-Z]$', 531 '^FI[0-9]{8}$', 532 '^FR[A-Z0-9]{2} [0-9]{9}$', 533 '^FR[A-Z0-9]{2}[0-9]{9}$', // pro jistotu, kdyby to Francouzi nepsali jen s mezerou (viz vyse) 534 '^GB[0-9]{3} [0-9]{4} [0-9]{2}$', '^GB[0-9]{3} [0-9]{4} [0-9]{2} [0-9]{3}$', '^GBGD[0-9]{3}$', '^GBHA[5-9][0-9]{2}$', 535 '^GB[0-9]{9}$', '^GB[0-9]{12}$', // pro jistotu, kdyby to Britove nepsali jen s mezerami (viz vyse) 536 '^HR[0-9]{11}$', 537 '^HU[0-9]{8}$', 538 '^IE[0-9]{7}[A-Z][W]{0,1}$', '^IE[0-9][0-9A-Z][0-9]{5}[A-Z]$', 539 '^IT[0-9]{11}$', 540 '^LT[0-9]{9}$', '^LT[0-9]{12}$', 541 '^LU[0-9]{8}$', 542 '^LV[0-9]{11}$', 543 '^MT[0-9]{8}$', 544 '^NL[0-9]{9}B[0-9]{2}$', 545 '^PL[0-9]{10}$', 546 '^PT[0-9]{9}$', 547 '^RO[0-9]{2,10}$', 548 '^SE[0-9]{12}$', 549 '^SI[0-9]{8}$', 550 '^SK[0-9]{10}$' 551 ]; 552 for (var i = 0; i < dic.length; i++) { 553 var dic_format = new RegExp(dic[i]); 554 if (dic_format.test(v)) { 555 return true; 556 } 557 } 558 return false; 559 } 560); 561 562// obecne telefonni cislo 563checkForm.addFieldType( 564 "phoneGeneral", 565 function (evt, elm) { 566 var v = elm.value; 567 if (!v) return true; 568 v = v.replace(/ /g, ''); 569 var format = new RegExp("^\\+[0-9]{2,15}$"); 570 if (format.test(v)) { 571 return true; 572 } 573 return false; 574 } 575); 576 577// regular expression 578checkForm.addFieldType( 579 "checkRegexp", 580 function (evt, elm) { 581 var v = elm.value; 582 if (!v) return true; 583 var reg_exp = elm.getAttribute("data-regexp"); 584 if (!reg_exp) return true; 585 var format = new RegExp(reg_exp); 586 if (format.test(v)) { 587 return true; 588 } 589 return false; 590 } 591); 592 593// Luhnův algoritmus pro kontrolu ÄÃsla platebnà karty 594checkForm.addFieldType( 595 "cardNumber", 596 function (evt, elm) { 597 var v = elm.value; 598 if (!v) return true; 599 600 if (/[^\d\- ]+/.test(v)) return false; 601 602 var nCheck = 0, nDigit = 0, bEven = false;
603 v = v.replace(/\D/g, ""); 604 605 for (var n = v.length - 1; n >= 0; n--) { 606 var cDigit = v.charAt(n), 607 nDigit = parseInt(cDigit, 10); 608 609 if (bEven) { 610 if ((nDigit *= 2) > 9) nDigit -= 9; 611 } 612 613 nCheck += nDigit; 614 bEven = !bEven; 615 } 616 617 return (nCheck % 10) == 0; 618 } 619); 620 621// zavolanie inicializacie checkForm-u pri zavedeni dokumentu 622if (typeof jQuery == 'undefined') { 623 evt.add(window, "load", checkForm.init); 624} 625else { 626 $(document).ready(function() { 627 checkForm.init(); 628 }); 629}
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.