1var RSFormProCalendars = {}; 2var RSFormProPrices = {}; 3var ajaxExtraValidationScript = {}; 4var RSClickedSubmitElement = false; 5 6if (typeof RSFormPro != 'object') { 7 var RSFormPro = {}; 8} 9 10RSFormPro.Forms = {}; 11RSFormPro.Editors = {}; 12RSFormPro.scrollToError = false; 13 14/* Handle HTML5 form fields validation for the forms without AjaxValidation enabled */ 15RSFormPro.setHTML5Validation = function (formId, isDisabledSubmit, layoutErrorClass) { 16 var submitElement = RSFormPro.getElementByType(formId, 'submit'); 17 for (i = 0; i < submitElement.length; i++) { 18 if (RSFormProUtils.hasClass(submitElement[i],'rsform-submit-button')) { 19 RSFormProUtils.addEvent(submitElement[i], 'click', (function (event) { 20 errorElements = RSFormPro.HTML5.validation(formId); 21 if (errorElements.length) { 22 for (j = 0; j < errorElements.length; j++) { 23 errorElements[j].field.className = errorElements[j].field.className.replace(' rsform-error', '') + ' rsform-error'; 24 if (document.getElementById('component' + errorElements[j].componentId)) { 25 document.getElementById('component' + errorElements[j].componentId).className = 'formError'; 26 } 27 if (layoutErrorClass) { 28 try { 29 var block = RSFormPro.getBlock(formId, RSFormProUtils.getAlias(errorElements[j].field.getAttribute('id'))); 30 block = block[0]; 31 block.className = block.className.replace(layoutErrorClass, '') + layoutErrorClass; 32 } catch (err) {} 33 } 34 } 35 36 if (RSFormPro.scrollToError){ 37 RSFormPro.gotoErrorElement(formId); 38 } 39 40 if (isDisabledSubmit) { 41 for (j = 0; j < submitElement.length; j++) { 42 submitElement[j].disabled = false; 43 } 44 } 45 46 event.preventDefault(); 47 } else { 48 if (isDisabledSubmit) { 49 // if the submit button or any other element has the id submit the form.submit() function is overwritten 50 if (typeof this.form.submit != 'function') { 51 document.createElement('form').submit.call(this.form) 52 } else { 53 this.form.submit(); 54 } 55 } 56 } 57 })); 58 } 59 } 60}; 61 62/* Disable the submit button when form is submitted functions */ 63RSFormPro.setDisabledSubmit = function(formId, ajaxValidation){ 64 if (!ajaxValidation) { 65 var submitElement = RSFormPro.getElementByType(formId, 'submit'); 66 for (i = 0; i < submitElement.length; i++) { 67 if (RSFormProUtils.hasClass(submitElement[i],'rsform-submit-button')) { 68 RSFormProUtils.addEvent(submitElement[i],'click', (function(event) { 69 for (j = 0; j < submitElement.length; j++) { 70 submitElement[j].disabled = true; 71 } 72 })); 73 } 74 } 75 } 76}; 77/* Thank You Message in Popup Window functions */ 78 79RSFormPro.showThankYouPopup = function (thankYouContainer){ 80 var content = thankYouContainer.innerHTML; 81 var gotoUrl = thankYouContainer.querySelector('#rsfp-thankyou-popup-return-link').value; 82 83 // remove the html part from the layout 84 thankYouContainer.parentNode.removeChild( thankYouContainer ); 85 86 document.body.className = document.body.className+' rsfp_popup_activated'; 87 document.body.innerHTML += '<div class="rsfp_thankyou_popup_outer" onclick="RSFormPro.accessLink(event,\''+gotoUrl+'\')"><div class="rsfp_thankyou_popup_inner" id="rsfp_thankyou_popup_inner"><div class="rsfp_thankou_popup_close_btn">×</div>'+content+'</div></div>'; 88 89 var popupWindowHeight = document.getElementById('rsfp_thankyou_popup_inner').offsetHeight; 90 var windowHeight = window.innerHeight; 91 92 var marginTop = (windowHeight - popupWindowHeight) / 2; 93 document.getElementById('rsfp_thankyou_popup_inner').style.marginTop = marginTop+'px'; 94} 95RSFormPro.accessLink = function(event,link) { 96 var clickedElementClass = event.target.className; 97 if (clickedElementClass == 'rsfp_thankyou_popup_outer' || clickedElementClass == 'rsfp_thankou_popup_close_btn') { 98 if (link.length > 0) { 99 document.location = link; 100 } else { 101 document.location.reload(); 102 } 103 } 104} 105 106/* Scroll to first error element */ 107RSFormPro.gotoErrorElement = function(formId){ 108 var form = RSFormPro.getForm(formId); 109 var errorElements = form.getElementsByClassName('formError'); 110 if (errorElements.length) {
111 var block = RSFormPro.findAncestor(errorElements[0], 'rsform-block'); 112 if (block) { 113 RSFormPro.scrollToElement(block); 114 } else { 115 RSFormPro.scrollToElement(errorElements[0]); 116 } 117 } 118} 119 120RSFormPro.findAncestor = function(el, cls){ 121 while(el = el.parentElement) { 122 var elementClasses = el.className; 123 elementClasses = elementClasses.split(' '); 124 if (elementClasses.indexOf(cls) >= 0) { 125 return el; 126 } 127 } 128 129 return false; 130} 131 132/* ScrollTo functions */ 133RSFormPro.scrollToElement = function(element){ 134 var to = element.offsetTop; 135 var scrollTop = window.pageYOffset || document.documentElement.scrollTop; 136 var documentView = window.innerHeight + scrollTop; 137 138 // this is more specific for the modern browsers 139 if (typeof element.getBoundingClientRect == 'function') { 140 to = element.getBoundingClientRect().top + scrollTop; 141 } 142 143 if (to < scrollTop || to > documentView) { 144 RSFormPro.scrollTo(to, 300); 145 } 146} 147 148RSFormPro.scrollTo = function(to, duration) { 149 if (duration <= 0) return; 150 var elementScrollTop = window.pageYOffset ? window.pageYOffset : document.documentElement.scrollTop; 151 var difference = to - elementScrollTop; 152 var perTick = difference / duration * 10; 153 154 setTimeout(function() { 155 var limitControl; 156 limitControl = window.pageYOffset ? window.pageYOffset : document.documentElement.scrollTop; 157 limitControl = limitControl + perTick; 158 window.scrollTo(0, limitControl); 159 // if the element has been reached or the scroll is at the bottom of the page no need to continue 160 if (limitControl == to) return; 161 162 RSFormPro.scrollTo(to, duration - 10); 163 }, 10); 164} 165 166/* Field specific functions */ 167 168RSFormPro.refreshCaptcha = function(componentId, captchaPath) { 169 if (!captchaPath) { 170 captchaPath = 'index.php?option=com_rsform&task=captcha&format=image&componentId=' + componentId; 171 } 172 document.getElementById('captcha' + componentId).src = captchaPath + '&' + Math.random(); 173 document.getElementById('captchaTxt' + componentId).value = ''; 174 document.getElementById('captchaTxt' + componentId).focus(); 175}; 176 177RSFormPro.initGeoLocation = function(term, id, mapid, map, marker, geocoder, type) { 178 var content = document.getElementById('rsform_geolocation'+id); 179 var address = document.getElementById(mapid).clientWidth; 180 181 document.getElementById('rsform_geolocation'+id).style.width = address+'px'; 182 document.getElementById('rsform_geolocation'+id).style.display = 'none'; 183 document.getElementById('rsform_geolocation'+id).innerHTML = ''; 184 185 if (term != '') { 186 geocoder.geocode( {'address': term }, function(results, status) { 187 if (status == 'OK') { 188 for (var i=0; i<results.length; i++) { 189 var item = results[i]; 190 var theli = document.createElement('li'); 191 var thea = document.createElement('a'); 192 193 thea.setAttribute('href','javascript:void(0)'); 194 thea.innerHTML = item.formatted_address; 195 196 RSFormProUtils.addEvent(thea,'click', (function() { 197 var mapValue = type ? item.formatted_address : item.geometry.location.lat().toFixed(5) + ',' + item.geometry.location.lng().toFixed(5); 198 var mapId = mapid; 199 var location = new google.maps.LatLng(item.geometry.location.lat().toFixed(5), item.geometry.location.lng().toFixed(5)); 200 201 return function() { 202 document.getElementById(mapId).value = mapValue; 203 marker.setPosition(location); 204 map.setCenter(location); 205 document.getElementById('rsform_geolocation'+id).style.display = 'none'; 206 } 207 })()); 208 209 theli.appendChild(thea); 210 content.appendChild(theli); 211 } 212 213 document.getElementById('rsform_geolocation'+id).style.display = ''; 214 } 215 }); 216 } 217}; 218 219RSFormPro.disableInvalidDates = function(fieldName) { 220 var theDate = new Date(), 221 day, 222 index; 223 224 for (day = 1; day <= 31; day++) { 225 var year = parseInt(document.getElementById(fieldName + 'y').value); 226 var month = parseInt(document.getElementById(fieldName + 'm').value) - 1; 227 228 index = day - 1; 229 if (document.getElementById(fieldName + 'd').options[0].value == '') { 230 index++; 231 } 232 document.getElementById(fieldName + 'd').options[index].disabled = false; 233 if (!isNaN(year) && !isNaN(month)) { 234 if (typeof theDate.__msh_oldSetFullYear == 'function') { 235 theDate.__msh_oldSetFullYear(year, month, day); 236 } else { 237 theDate.setFullYear(year, month, day); 238 } 239 240 if (theDate.getDate() != day || theDate.getMonth() != month) { 241 document.getElementById(fieldName + 'd').options[index].disabled = true; 242 } 243 } 244 } 245 if (document.getElementById(fieldName + 'd').options[document.getElementById(fieldName + 'd').selectedIndex].disabled == true) { 246 for (day = 31; day >= 28; day--) { 247 index = day - 1; 248 if (document.getElementById(fieldName + 'd').options[0].value == '') { 249 index++; 250 } 251 if (document.getElementById(fieldName + 'd').options[index].disabled == false) { 252 document.getElementById(fieldName + 'd').value = day; 253 break; 254 } 255 } 256 } 257}; 258 259/* Number functions */ 260 261RSFormPro.formatNumber = function(number, decimals, dec_point, thousands_sep) { 262 var n = number, prec = decimals; 263 n = !isFinite(+n) ? 0 : +n; 264 prec = !isFinite(+prec) ? 0 : Math.abs(prec); 265 var sep = (typeof thousands_sep == "undefined") ? ',' : thousands_sep; 266 var dec = (typeof dec_point == "undefined") ? '.' : dec_point; 267 268 var s = (prec > 0) ? n.toFixed(prec) : Math.round(n).toFixed(prec); //fix for IE parseFloat(0.55).toFixed(0) = 0; 269 270 var abs = Math.abs(n).toFixed(prec); 271 var _, i; 272 273 if (abs >= 1000) { 274 _ = abs.split(/\D/); 275 i = _[0].length % 3 || 3; 276 277 _[0] = s.slice(0,i + (n < 0)) + 278 _[0].slice(i).replace(/(\d{3})/g, sep+'$1'); 279 280 s = _.join(dec); 281 } else { 282 s = s.replace('.', dec); 283 } 284 285 return s; 286}; 287 288RSFormPro.toNumber = function(number, decimal, thousands, decimals) { 289 // Remove decimals first 290 if (parseInt(decimals) > 0 && number.lastIndexOf(decimal) > -1) { 291 var index = number.lastIndexOf(decimal);
292 number = number.substring(0, index) + 'DECIMALS' + number.substring(index + 1); 293 } 294 295 // Remove thousands separator 296 if (number.indexOf(thousands) > -1) { 297 number = number.split(thousands).join(''); 298 } 299 300 number = number.split('DECIMALS').join('.'); 301 return parseFloat(number); 302}; 303 304/* Form and element functions */ 305 306RSFormPro.getForm = function(formId) { 307 if (typeof RSFormPro.Forms[formId] == 'undefined') { 308 var formIds = document.getElementsByName('form[formId]'); 309 for (var i=0; i<formIds.length; i++) 310 { 311 if (parseInt(formIds[i].value) != parseInt(formId)) 312 continue; 313 314 var form = formIds[i].parentNode; 315 if (form.tagName == 'FORM' || form.nodeName == 'FORM') { 316 RSFormPro.Forms[formId] = form; 317 return form; 318 } 319 320 while (form.parentNode) 321 { 322 form = form.parentNode; 323 if (form.tagName == 'FORM' || form.nodeName == 'FORM') { 324 RSFormPro.Forms[formId] = form; 325 return form; 326 } 327 } 328 } 329 } 330 331 return RSFormPro.Forms[formId]; 332}; 333 334RSFormPro.getValue = function(formId, name) { 335 var form = RSFormPro.getForm(formId); 336 var values = []; 337 338 if (typeof form != 'undefined') 339 { 340 for (var i = 0; i < form.elements.length; i++) 341 { 342 var element = form.elements[i]; 343 var tagName = element.tagName || element.nodeName; 344 345 switch (tagName) 346 { 347 case 'INPUT': 348 if (element.type) 349 switch (element.type.toUpperCase()) 350 { 351 case 'TEXT': 352 case 'NUMBER': 353 case 'HIDDEN': 354 if (!element.name || element.name != 'form[' + name + ']') continue; 355 return element.value; 356 break; 357 358 case 'RADIO': 359 if (!element.name || element.name != 'form[' + name + ']') continue; 360 361 if (element.checked == true) { 362 values.push(element.value); 363 } 364 break; 365 366 case 'CHECKBOX': 367 if (!element.name || element.name != 'form[' + name + '][]') continue; 368 if (element.checked == true) { 369 values.push(element.value); 370 } 371 break; 372 } 373 break; 374 375 case 'SELECT': 376 if (!element.name || element.name != 'form[' + name + '][]') continue; 377 378 if (element.options) 379 for (var o=0; o<element.options.length; o++) 380 if (element.options[o].selected) 381 { 382 values.push(element.options[o].value); 383 } 384 break; 385 } 386 } 387 } 388 389 return values; 390}; 391 392RSFormPro.getElementByType = function(formId, type) { 393 var form = RSFormPro.getForm(formId); 394 type = type.toUpperCase(); 395 var elements = []; 396 397 if (typeof form != 'undefined') 398 { 399 for (var i = 0; i < form.elements.length; i++) 400 { 401 var element = form.elements[i]; 402 var tagName = element.tagName || element.nodeName; 403 switch (tagName) 404 { 405 case 'INPUT': 406 case 'BUTTON': 407 if (element.type.toUpperCase() == type) { 408 elements.push(element); 409 } 410 break; 411 412 case 'SELECT': 413 case 'TEXTAREA': 414 if (type == 'SELECT' || type == 'TEXTAREA') { 415 elements.push(element); 416 } 417 break; 418 } 419 } 420 } 421 422 return elements; 423}; 424 425RSFormPro.isChecked = function(formId, name, value) { 426 var isChecked = false; 427 var form = RSFormPro.getForm(formId); 428 429 if (typeof form != 'undefined') 430 { 431 primary_loop: 432 for (var i=0; i<form.elements.length; i++) 433 { 434 var element = form.elements[i]; 435 var tagName = element.tagName || element.nodeName; 436 437 switch (tagName) 438 { 439 case 'INPUT': 440 if (element.type) 441 switch (element.type.toUpperCase()) 442 { 443 case 'RADIO': 444 if (!element.name || element.name != 'form[' + name + ']') continue; 445 if (element.checked == true && element.value == value) 446 { 447 isChecked = true; 448 break primary_loop; 449 } 450 break; 451 452 case 'CHECKBOX': 453 if (!element.name || element.name != 'form[' + name + '][]') continue; 454 if (element.checked == true && element.value == value) 455 { 456 isChecked = true; 457 break primary_loop; 458 } 459 break; 460 } 461 break; 462 463 case 'SELECT': 464 if (!element.name || element.name != 'form[' + name + '][]') continue; 465 466 if (element.options) 467 for (var o=0; o<element.options.length; o++) 468 if (element.options[o].selected && element.options[o].value == value) 469 { 470 isChecked = true; 471 break primary_loop; 472 } 473 break; 474 } 475 } 476 } 477 478 return isChecked; 479};
480 481RSFormPro.getBlock = function(formId, block) { 482 var form = RSFormPro.getForm(formId); 483 var possible = false; 484 var blocks, current_block; 485 486 if (typeof form != 'undefined') { 487 if (blocks = getElementsByClassName('rsform-block')) { 488 for (i=0; i<blocks.length; i++) { 489 var classes = blocks[i].className.split(' '); 490 for (c=0; c<classes.length; c++) { 491 if (classes[c] == 'rsform-block-' + block) { 492 if (blocks[i].parentNode) { 493 current_block = blocks[i]; 494 if (current_block == form) 495 return [ blocks[i] ]; 496 497 while (current_block.parentNode) { 498 current_block = current_block.parentNode; 499 if (current_block == form) 500 return [ blocks[i] ]; 501 } 502 } 503 504 possible = [ blocks[i] ]; 505 } 506 } 507 } 508 } 509 } 510 511 return possible; 512}; 513 514RSFormPro.getFieldsByName = function(formId, name) { 515 var form = RSFormPro.getForm(formId); 516 var results = []; 517 var pushed = false; 518 519 if (typeof form != 'undefined') { 520 for (var i=0; i<form.elements.length; i++) { 521 var element = form.elements[i]; 522 pushed = false; 523 if (element.name && ( 524 // single fields 525 element.name == 'form[' + name + ']' || 526 // multiple fields 527 element.name == 'form[' + name + '][]' || 528 // new field - Birthday field 529 element.name == 'form[' + name + '][d]' || 530 element.name == 'form[' + name + '][m]' || 531 element.name == 'form[' + name + '][y]' 532 )) { 533 results.push(element); 534 pushed = true; 535 } 536 537 if (pushed) { 538 // for calendar 539 if (element.id && element.id.indexOf('txtcal') > -1) { 540 var suffix = element.id.replace('txtcal', ''); 541 results.push(document.getElementById('btn' + suffix)); 542 } 543 // for labels (radio, checkbox) 544 var labels = form.getElementsByTagName('label'); 545 for (var l=0; l<labels.length; l++) { 546 if (labels[l].htmlFor && labels[l].htmlFor == element.id) 547 results.push(labels[l]); 548 } 549 } 550 } 551 } 552 553 return results; 554}; 555 556/*HTML5 simulators*/ 557 558RSFormPro.HTML5 = { 559 validation: function(formId){ 560 var form = RSFormPro.getForm(formId); 561 var errorElements = []; 562 var html5types = ['number', 'email', 'range', 'url', 'tel']; 563 564 var checkValidityExists = true; 565 var page = 0; 566 if (form.elements.length) { 567 for (i=0; i<form.elements.length; i++) { 568 if (!checkValidityExists) { 569 break; 570 } 571 572 // if the multiple form is present and also validation we will need to find in witch page the element is located 573 if (form.elements[i].type == 'button') { 574 var onclick = form.elements[i].getAttribute('onclick'); 575 if (typeof onclick == 'string' && onclick.indexOf('rsfp_changePage') >= 0){ 576 var countCommas = 0; 577 var pos = onclick.indexOf(','); 578 while (pos > -1) { 579 ++countCommas; 580 pos = onclick.indexOf(',', ++pos); 581 } 582 583 584 if (countCommas > 2) { 585 page++; 586 } 587 } 588 } 589 if (html5types.indexOf(form.elements[i].type) >= 0) { 590 if ( typeof(form.elements[i].checkValidity) == "function" && checkValidityExists) { 591 if (!form.elements[i].checkValidity()) { 592 var elementObj = { 593 field: form.elements[i], 594 page: page 595 }; 596 // try to get the componentId 597 var componentId = RSFormPro.HTML5.getComponentId(formId, form.elements[i].getAttribute('id')); 598 if (componentId) { 599 elementObj.componentId = componentId; 600 } 601 602 errorElements.push(elementObj); 603 } 604 } else { 605 checkValidityExists = false; 606 } 607 } 608 } 609 } 610 return errorElements; 611 }, 612 613 componentIds: {}, 614 615 getComponentId: function(formId, elementAlias) { 616 if (typeof RSFormPro.HTML5.componentIds[formId] == 'undefined') { 617 RSFormPro.HTML5.componentIds[formId] = {}; 618 } 619 620 if (typeof RSFormPro.HTML5.componentIds[formId][elementAlias] == 'undefined') { 621 var block = RSFormPro.getBlock(formId, RSFormProUtils.getAlias(elementAlias)); 622 var componentIdBlock = RSFormProUtils.getElementsByClassName('formNoError', 'span', block[0]); 623 if (componentIdBlock.length) { 624 var componentId = componentIdBlock[0].getAttribute('id'); 625 RSFormPro.HTML5.componentIds[formId][elementAlias] = componentId.replace('component', ''); 626 } else { 627 RSFormPro.HTML5.componentIds[formId][elementAlias] = false; 628 } 629 } 630 631 return RSFormPro.HTML5.componentIds[formId][elementAlias]; 632 } 633}; 634 635/* Pagination functions */ 636 637RSFormPro.Pages = { 638 change: function(formId, page, totalPages, validate, parentErrorClass) { 639 // callback functions if next page is clicked 640 var direction = RSFormPro.Pages.checkDirection(formId, page); 641 if (direction == 'next') { 642 RSFormPro.callbacks.runCallback(formId, 'nextPage'); 643 } 644 RSFormPro.callbacks.runCallback(formId, 'changePage'); 645 646 var thePage; 647 648 if (validate) { 649 var form = RSFormPro.getForm(formId); 650 if (!RSFormPro.Ajax.validate(form, page, parentErrorClass, totalPages)) { 651 return false; 652 } 653 } 654 655 for (var i = 0; i <= totalPages; i++) { 656 thePage = document.getElementById('rsform_' + formId + '_page_' + i); 657 if (thePage) { 658 rsfp_hidePage(thePage); 659 } 660 } 661 662 thePage = document.getElementById('rsform_' + formId + '_page_' + page); 663 if (thePage) { 664 rsfp_showPage(thePage); 665 try { 666 var func = window["rsfp_showProgress_" + formId];
667 if (typeof func == "function") { 668 func(page); 669 } 670 } 671 catch (err) {} 672 } 673 }, 674 hide: function(thePage) { 675 RSFormProUtils.addClass(thePage, 'formHidden'); 676 }, 677 show: function(thePage) { 678 RSFormProUtils.removeClass(thePage, 'formHidden'); 679 }, 680 681 checkDirection : function(formId, page) { 682 var base = RSFormPro.Pages; 683 if (typeof base.history[formId] == 'undefined') { 684 base.history[formId] = page; 685 return 'next'; 686 } else { 687 var direction; 688 if (base.history[formId] <= page ) { 689 direction = 'next'; 690 } else { 691 direction = 'prev'; 692 } 693 base.history[formId] = page; 694 695 return direction; 696 } 697 }, 698 history: {} 699}; 700 701/* Condition functions */ 702RSFormPro.Conditions = { 703 add: function(formId, name, fnCondition) { 704 var form = RSFormPro.getForm(formId); 705 706 if (typeof form != 'undefined') { 707 for (var i = 0; i < form.elements.length; i++) { 708 var element = form.elements[i]; 709 var tagName = element.tagName || element.nodeName; 710 if (element.name && (element.name == 'form[' + name + ']' || element.name == 'form[' + name + '][]')) { 711 if (tagName == 'SELECT') { 712 RSFormProUtils.addEvent(element, 'change', function() { 713 fnCondition(); 714 }); 715 } else { 716 RSFormProUtils.addEvent(element, 'click', function() { 717 fnCondition(); 718 }); 719 } 720 } 721 } 722 } 723 }, 724 runAll: function(formId) { 725 var func = window["rsfp_runAllConditions" + formId]; 726 if (typeof func == "function") { 727 func(); 728 } 729 }, 730 addReset: function(formId) { 731 var resetElements = RSFormPro.getElementByType(formId, 'reset'); 732 if (resetElements.length > 0) 733 { 734 for (var i = 0; i < resetElements.length; i++) 735 { 736 RSFormProUtils.addEvent(resetElements[i], 'click', function() { 737 window.setTimeout(function() { 738 RSFormPro.Conditions.runAll(formId); 739 }, 1); 740 }); 741 } 742 } 743 } 744}; 745 746/* Calculation functions */ 747 748RSFormPro.Calculations = { 749 addEvents: function(formId, fields) { 750 var func = window["rsfp_Calculations" + formId]; 751 var thefields = fields ? fields : RSFormProPrices; 752 753 // Detect IE8. 754 var isIE8 = navigator.userAgent.match(/MSIE 8\.0/); 755 var event = 'click'; 756 757 var resetElements = RSFormPro.getElementByType(formId, 'reset'); 758 if (resetElements.length > 0) 759 { 760 for (var i = 0; i < resetElements.length; i++) 761 { 762 RSFormProUtils.addEvent(resetElements[i], 'click', function() { 763 if (typeof func == "function") { 764 window.setTimeout(func, 1); 765 } 766 }); 767 } 768 } 769 770 for (var field in thefields) { 771 if (!thefields.hasOwnProperty(field)) { 772 continue; 773 } 774 field = field.replace(formId+'_',''); 775 objects = RSFormPro.getFieldsByName(formId,field); 776 for(i = 0; i < objects.length;i++) { 777 tagName = objects[i].tagName || objects[i].nodeName; 778 779 if (tagName == 'INPUT' || tagName == 'SELECT') { 780 // IE8 fix. 781 if (tagName == 'INPUT' && isIE8 && objects[i].type && objects[i].type.toLowerCase() == 'checkbox') { 782 event = 'click'; 783 } else { 784 event = 'change'; 785 } 786
787 RSFormProUtils.addEvent(objects[i], event, function() { 788 if (typeof func == "function") { 789 func(); 790 } 791 }); 792 } 793 } 794 } 795 } 796}; 797 798/* AJAX functions */ 799RSFormPro.Ajax = { 800 Wait: false, 801 URL: false, 802 Params: {}, 803 getParamsObject: function() { 804 return { 805 vars: [], 806 push: function(str) { 807 return this.vars.push(str); 808 }, 809 810 indexOf: function(str) { 811 return this.vars.join('&').indexOf(str); 812 }, 813 814 replace: function(r, w) { 815 this.vars = this.vars.join('&').replace(r, w).split('&'); 816 817 return this.vars.join('&'); 818 }, 819 820 toString: function() { 821 return this.vars.join('&'); 822 } 823 }; 824 }, 825 getXHR: function() { 826 try { 827 return new window.XMLHttpRequest(); 828 } catch ( e ) {} 829 }, 830 getXHRLegacy: function() { 831 return { 832 send: function(data) 833 { 834 if (data === RSFormPro.Ajax.Params) 835 { 836 data = data.toString(); 837 } 838 839 return RSFormPro.Ajax.xhr.send(data); 840 } 841 } 842 }, 843 displayValidationErrors: function(formComponents, task, formId, data) { 844 if (task == 'afterSend') { 845 var ids, 846 i, 847 j, 848 id, 849 formComponent, 850 firstErrorElement, 851 elementBlock; 852 853 ids = data.response[0].split(','); 854 for (i = 0; i < ids.length; i++) { 855 id = parseInt(ids[i]); 856 if (!isNaN(id) && typeof formComponents[id] != 'undefined') { 857 formComponent = RSFormPro.getFieldsByName(formId, formComponents[id]); 858 if (formComponent && formComponent.length > 0) { 859 for (j = 0; j < formComponent.length; j++) { 860 if (formComponent[j]) { 861 formComponent[j].className = formComponent[j].className.replace(' rsform-error', ''); 862 if (typeof data.parentErrorClass != 'undefined') { 863 try { 864 elementBlock = RSFormPro.getBlock(formId, RSFormProUtils.getAlias(formComponents[id])); 865 866 elementBlock = elementBlock[0]; 867 elementBlock.className = elementBlock.className.replace(data.parentErrorClass, ''); 868 } catch (err) {} 869 } 870 } 871 } 872 } 873 } 874 } 875 876 ids = data.response[1].split(','); 877 var doScroll = false; 878 for (i = 0; i < ids.length; i++) { 879 id = parseInt(ids[i]); 880 if (!isNaN(id) && typeof formComponents[id] != 'undefined') { 881 formComponent = RSFormPro.getFieldsByName(formId, formComponents[id]); 882 if (formComponent && formComponent.length > 0) { 883 for (j = 0; j < formComponent.length; j++) { 884 if (formComponent[j]) { 885 formComponent[j].className = formComponent[j].className.replace(' rsform-error', '') + ' rsform-error'; 886 if (!doScroll) { 887 doScroll = true; 888 } 889 if (typeof data.parentErrorClass != 'undefined') { 890 try { 891 elementBlock = RSFormPro.getBlock(formId, RSFormProUtils.getAlias(formComponents[id])); 892 893 elementBlock = elementBlock[0]; 894 elementBlock.className = elementBlock.className.replace(data.parentErrorClass, '') + data.parentErrorClass; 895 } catch (err) {} 896 } 897 } 898 } 899 } 900 } 901 } 902 903 // scroll to first error elment 904 if (RSFormPro.scrollToError && doScroll){ 905 RSFormPro.gotoErrorElement(formId); 906 } 907 } 908 }, 909 validate: function(form, page, parentErrorClass ,totalPages) { 910 try { 911 var el = form.elements.length; 912 } catch (err) { 913 form = this; 914 } 915 916 RSFormPro.Ajax.xhr = RSFormPro.Ajax.getXHR(); 917 RSFormPro.Ajax.xmlHttp = RSFormPro.Ajax.getXHRLegacy(); 918 var url = 'index.php?option=com_rsform&task=ajaxValidate'; 919 if (typeof RSFormPro.Ajax.URL == 'string') { 920 url = RSFormPro.Ajax.URL; 921 } 922 923 RSFormPro.Ajax.Params = RSFormPro.Ajax.getParamsObject(); 924 925 var submits = [], 926 errorFields = [], 927 success = false, 928 formId = 0, 929 ids, 930 totalJSDetectedPages = 0, 931 lastClickedElement, 932 i, 933 j; 934 935 for (i=0; i<form.elements.length; i++) 936 { 937 // try and detect total pages of the form 938 if (form.elements[i].type == 'button') { 939 var onclick = form.elements[i].getAttribute('onclick'); 940 if (typeof onclick == 'string' && onclick.indexOf('rsfp_changePage') >= 0) { 941 var countCommas = 0; 942 var pos = onclick.indexOf(','); 943 while (pos > -1) { 944 ++countCommas; 945 pos = onclick.indexOf(',', ++pos); 946 } 947 948 if (countCommas > 2) { 949 totalJSDetectedPages++; 950 } 951 } 952 } 953 954 // don't send an empty value 955 if (!form.elements[i].name) continue; 956 if (form.elements[i].name.length == 0) continue; 957 // check if the checkbox is checked 958 if (form.elements[i].type == 'checkbox' && form.elements[i].checked == false) continue; 959 // check if the radio is selected 960 if (form.elements[i].type == 'radio' && form.elements[i].checked == false) continue; 961 962 if (form.elements[i].type == 'submit' && form.elements[i].getAttribute('data-disableonsubmit') == '1') { 963 submits.push(form.elements[i]); 964 form.elements[i].disabled = true; 965 } 966 967 // check if form is a dropdown with multiple selections 968 if (form.elements[i].type == 'select-multiple') 969 { 970 for (j = 0; j < form.elements[i].options.length; j++) { 971 if (form.elements[i].options[j].selected) { 972 RSFormPro.Ajax.Params.push(form.elements[i].name + '=' + encodeURIComponent(form.elements[i].options[j].value)); 973 } 974 } 975 976 continue; 977 } 978 979 if (form.elements[i].name == 'form[formId]') { 980 formId = form.elements[i].value; 981 } 982 983 if (typeof RSFormPro.Editors[form.elements[i].name] == 'function') { 984 RSFormPro.Ajax.Params.push(form.elements[i].name + '=' + encodeURIComponent(RSFormPro.Editors[form.elements[i].name]())); 985 } else { 986 RSFormPro.Ajax.Params.push(form.elements[i].name + '=' + encodeURIComponent(form.elements[i].value)); 987 } 988 } 989 990 errorFields = RSFormPro.HTML5.validation(formId); 991 992 if (page) { 993 RSFormPro.Ajax.Params.push('page=' + page); 994 } 995 996 RSFormPro.Ajax.xhr.open("POST", url, true); 997 998 //Send the proper header information along with the request 999 RSFormPro.Ajax.xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 1000 1001 if (typeof ajaxExtraValidationScript[formId] == 'function') { 1002 ajaxExtraValidationScript[formId]('beforeSend', formId, {'url': url, 'params': RSFormPro.Ajax.Params}); 1003 } 1004 1005 if (!RSFormPro.Ajax.Wait) 1006 { 1007 // B/C layer 1008 RSFormPro.Ajax.xmlHttp.send(RSFormPro.Ajax.Params); 1009 } 1010 success = true; 1011 1012 RSFormPro.Ajax.xhr.onreadystatechange = function() { 1013 if (RSFormPro.Ajax.xhr.readyState == 4 && RSFormPro.Ajax.xhr.status == 200) { 1014 if (RSFormPro.Ajax.xhr.responseText.indexOf("\n") != -1) 1015 { 1016 1017 var response = RSFormPro.Ajax.xhr.responseText.split("\n"); 1018 // All spans set to no error 1019 ids = response[0].split(','); 1020 for (i = 0; i < ids.length; i++) 1021 if (!isNaN(parseInt(ids[i])) && document.getElementById('component'+ids[i])) { 1022 document.getElementById('component'+ids[i]).className = 'formNoError'; 1023 } 1024 1025 // Show errors 1026 ids = response[1].split(','); 1027 1028 // add the HTML5 elements with errors 1029 var errorOnPage; 1030 if (errorFields.length) { 1031 for (i = 0; i < errorFields.length; i++) { 1032 if (typeof errorFields[i].componentId != 'undefined') { 1033 if (typeof page == 'undefined' || (page - 1) == errorFields[i].page) { 1034 ids.push(errorFields[i].componentId); 1035 if (typeof errorOnPage != 'undefined') { 1036 errorOnPage = errorFields[i].page < errorOnPage ? errorFields[i].page : errorOnPage; 1037 } else { 1038 errorOnPage = errorFields[i].page; 1039 } 1040 } 1041 } 1042 } 1043 } 1044 1045 1046 var errorComponents = []; 1047 for (i = 0; i < ids.length; i++) { 1048 if (!isNaN(parseInt(ids[i]))) 1049 { 1050 if (document.getElementById('component' + ids[i])) 1051 { 1052 document.getElementById('component' + ids[i]).className = 'formError'; 1053 } 1054 errorComponents.push(ids[i]); 1055 success = false; 1056 } 1057 } 1058 1059 // lets detect if the multiple page form is submitted 1060 1061 var changePageHTML5Errors = false; 1062 if (totalJSDetectedPages > 0 && RSClickedSubmitElement && submits.indexOf(RSClickedSubmitElement) >= 0 && typeof errorOnPage != 'undefined') { 1063 changePageHTML5Errors = true; 1064 } 1065 //return false; 1066 if (response.length == 4 || changePageHTML5Errors) 1067 { 1068 if (response.length == 4) { 1069 page = parseInt(response[2]) - 1; 1070 totalPages = parseInt(response[3]); 1071 if (changePageHTML5Errors) { 1072 page = page > errorOnPage ? errorOnPage : page; 1073 } 1074 } else { 1075 if (changePageHTML5Errors) { 1076 page = errorOnPage; 1077 totalPages = totalJSDetectedPages;
1078 } 1079 } 1080 1081 rsfp_changePage(formId, page, totalPages, false); 1082 } 1083 1084 if (typeof ajaxExtraValidationScript[formId] == 'function') { 1085 // rewrite the response so that all the error components are added (that includes HTML5 fields) 1086 if (errorComponents.length) { 1087 response[1] = errorComponents.join(); 1088 } 1089 ajaxExtraValidationScript[formId]('afterSend', formId, {'url': url, 'params': RSFormPro.Ajax.Params, 'response': response, 'parentErrorClass': parentErrorClass}); 1090 } 1091 } 1092 1093 if (success == false) 1094 { 1095 // The submits must be clickable again 1096 for (i = 0; i < submits.length; i++) { 1097 submits[i].disabled = false; 1098 } 1099 1100 try { 1101 if (typeof page == 'undefined' || page == 0) { 1102 RSFormPro.callbacks.runCallback(formId, 'afterValidationFailed'); // callback functions if validation fails when form is submitted 1103 } else { 1104 RSFormPro.callbacks.runCallback(formId, 'nextPageFailed'); // callback functions if validation fails when a specific page of the form is checked 1105 } 1106 if (document.getElementById('rsform_error_' + formId)) { 1107 document.getElementById('rsform_error_' + formId).style.display = 'block'; 1108 } 1109 } 1110 catch (err) { } 1111 } 1112 1113 if (success == true) { 1114 // Change the page if the validation passes 1115 if (page) { 1116 rsfp_changePage(formId, page, totalPages, false); 1117 // The submits must be clickable again 1118 for (i = 0; i < submits.length; i++) { 1119 submits[i].disabled = false; 1120 } 1121 } else { 1122 // the submit button has been presed so we need to submit the form 1123 // if the submit button or any other element has the id submit the form.submit() function is overwritten 1124 if (typeof form.submit != 'function') { 1125 document.createElement('form').submit.call(form) 1126 } else { 1127 form.submit(); 1128 } 1129 } 1130 1131 try { 1132 if (typeof page == 'undefined' || page == 0) { 1133 RSFormPro.callbacks.runCallback(formId, 'afterValidationSuccess'); // callback functions if validation succeeds 1134 } else { 1135 RSFormPro.callbacks.runCallback(formId, 'nextPageSuccess'); // callback functions if validation succeeds when a specific page of the form is checked 1136 } 1137 document.getElementById('rsform_error_' + formId).style.display = 'none'; 1138 } 1139 catch (err) { } 1140 } 1141 return success; 1142 } 1143 } 1144 1145 return false; 1146 } 1147}; 1148 1149RSFormPro.callbacks = { 1150 allCallbacks: {}, 1151 1152 addCallback: function(formId, callbackName, args) { 1153 var base = RSFormPro.callbacks; 1154 1155 if (typeof base.allCallbacks[formId] == 'undefined') { 1156 base.allCallbacks[formId] = {} 1157 } 1158 1159 if (typeof base.allCallbacks[formId][callbackName] == 'undefined') { 1160 base.allCallbacks[formId][callbackName] = []; 1161 } 1162 1163 base.allCallbacks[formId][callbackName].push(args); 1164 }, 1165 1166 runCallback: function(formId, callbackName) { 1167 var base = RSFormPro.callbacks; 1168 if (typeof base.allCallbacks[formId] != 'undefined' && typeof base.allCallbacks[formId][callbackName] != 'undefined' && base.allCallbacks[formId][callbackName].length > 0) { 1169 for (var i = 0; i < base.allCallbacks[formId][callbackName].length; i++) { 1170 var args = base.allCallbacks[formId][callbackName][i]; 1171 var functionName = args[0]; 1172 1173 var functionArgs = []; 1174 for (var j = 1; j < args.length; j++) { 1175 functionArgs.push(args[j]); 1176 } 1177 1178 // execute the callback function set for this trigger 1179 functionName.apply(self, functionArgs); 1180 } 1181 } 1182 } 1183} 1184 1185/* Helper functions */ 1186 1187var RSFormProUtils = { 1188 addEvent: function(obj, evType, fn) { 1189 if (obj.addEventListener) 1190 { 1191 obj.addEventListener(evType, fn, false); 1192 return true; 1193 } 1194 else if (obj.attachEvent) 1195 { 1196 var r = obj.attachEvent("on"+evType, fn); 1197 return r; 1198 } 1199 else 1200 { 1201 return false; 1202 } 1203 }, 1204 hasClass: function (el, name) { 1205 return new RegExp('(\\s|^)' + name + '(\\s|$)').test(el.className); 1206 }, 1207 addClass: function(el, name) { 1208 if (!RSFormProUtils.hasClass(el, name)) { 1209 el.className += (el.className ? ' ' : '') + name; 1210 } 1211 }, 1212 removeClass: function(el, name) { 1213 if (RSFormProUtils.hasClass(el, name)) { 1214 el.className = el.className.replace(new RegExp('(\\s|^)' + name + '(\\s|$)'),' ').replace(/^\s+|\s+$/g, ''); 1215 } 1216 }, 1217 setDisplay: function (items, value) { 1218 for (var i = 0; i < items.length; i++) { 1219 items[i].style.display = value; 1220 } 1221 }, 1222 getAlias: function(str) { 1223 str = str.replace(/\-/g, ' '); 1224 1225 if (!String.prototype.trim) { 1226 str = str.replace(/^\s+|\s+$/g, ''); 1227 } else { 1228 str = str.trim(); 1229 } 1230 1231 str = str.toLowerCase(); 1232 str = str.replace(/(\s|[^A-Za-z0-9\-])+/g, '-'); 1233 str = str.replace(/^\-+|\-+$/g, ''); 1234 1235 return str; 1236 }, 1237 getElementsByClassName: function (className, tag, elm) { 1238 if (document.getElementsByClassName) { 1239 getElementsByClassName = function (className, tag, elm) { 1240 elm = elm || document; 1241 var elements = elm.getElementsByClassName(className), 1242 nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null, 1243 returnElements = [], 1244 current; 1245 for(var i=0, il=elements.length; i<il; i+=1){ 1246 current = elements[i]; 1247 if(!nodeName || nodeName.test(current.nodeName)) { 1248 returnElements.push(current); 1249 } 1250 } 1251 return returnElements; 1252 }; 1253 } else if (document.evaluate) { 1254 getElementsByClassName = function (className, tag, elm) { 1255 tag = tag || "*"; 1256 elm = elm || document; 1257 var classes = className.split(" "), 1258 classesToCheck = "", 1259 xhtmlNamespace = "http://www.w3.org/1999/xhtml", 1260 namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null, 1261 returnElements = [], 1262 elements, 1263 node; 1264 for(var j=0, jl=classes.length; j<jl; j+=1){ 1265 classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]"; 1266 }
1267 try { 1268 elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null); 1269 } 1270 catch (e) { 1271 elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null); 1272 } 1273 while ((node = elements.iterateNext())) { 1274 returnElements.push(node); 1275 } 1276 return returnElements; 1277 }; 1278 } else { 1279 getElementsByClassName = function (className, tag, elm) { 1280 tag = tag || "*"; 1281 elm = elm || document; 1282 var classes = className.split(" "), 1283 classesToCheck = [], 1284 elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag), 1285 current, 1286 returnElements = [], 1287 match; 1288 for(var k=0, kl=classes.length; k<kl; k+=1){ 1289 classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)")); 1290 } 1291 for(var l=0, ll=elements.length; l<ll; l+=1){ 1292 current = elements[l]; 1293 match = false; 1294 for(var m=0, ml=classesToCheck.length; m<ml; m+=1){ 1295 match = classesToCheck[m].test(current.className); 1296 if (!match) { 1297 break; 1298 } 1299 } 1300 if (match) { 1301 returnElements.push(current); 1302 } 1303 } 1304 return returnElements; 1305 }; 1306 } 1307 1308 return getElementsByClassName(className, tag, elm); 1309 } 1310}; 1311 1312function isset() { 1313 // http://kevin.vanzonneveld.net 1314 // + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) 1315 // + improved by: FremyCompany 1316 // + improved by: Onno Marsman 1317 // + improved by: RafaÅ Kukawski 1318 // * example 1: isset( undefined, true); 1319 // * returns 1: false 1320 // * example 2: isset( 'Kevin van Zonneveld' ); 1321 // * returns 2: true 1322 var a = arguments, 1323 l = a.length, 1324 i = 0, 1325 undef; 1326 1327 if (l === 0) { 1328 throw new Error('Empty isset'); 1329 } 1330 1331 while (i !== l) { 1332 if (a[i] === undef || a[i] === null) { 1333 return false; 1334 } 1335 i++; 1336 } 1337 return true; 1338} 1339 1340/* Legacy functions */ 1341 1342function rsfp_geolocation(term, id, mapid, map, marker, geocoder, type) { 1343 return RSFormPro.initGeoLocation(term, id, mapid, map, marker, geocoder, type); 1344} 1345 1346function refreshCaptcha(componentId, captchaPath) { 1347 return RSFormPro.refreshCaptcha(componentId, captchaPath); 1348} 1349 1350function number_format(number, decimals, dec_point, thousands_sep) { 1351 return RSFormPro.formatNumber(number, decimals, dec_point, thousands_sep); 1352} 1353 1354function rsfp_toNumber(number, decimal, thousands, decimals) { 1355 return RSFormPro.toNumber(number, decimal, thousands, decimals); 1356} 1357 1358function rsfp_getForm(formId) { 1359 return RSFormPro.getForm(formId); 1360} 1361 1362function rsfp_getValue(formId, name) { 1363 return RSFormPro.getValue(formId, name); 1364} 1365 1366function rsfp_verifyChecked(formId, name, value) { 1367 return RSFormPro.isChecked(formId, name, value); 1368} 1369 1370function rsfp_getBlock(formId, block) { 1371 return RSFormPro.getBlock(formId, block); 1372} 1373 1374function rsfp_getFieldsByName(formId, name) { 1375 return RSFormPro.getFieldsByName(formId, name); 1376} 1377 1378function rsfp_addEvent(obj, evType, fn) { 1379 return RSFormProUtils.addEvent(obj, evType, fn); 1380} 1381 1382function rsfp_setDisplay(items, value) { 1383 return RSFormProUtils.setDisplay(items, value); 1384} 1385 1386function stringURLSafe(str) { 1387 return RSFormProUtils.getAlias(str); 1388} 1389 1390function rsfp_changePage(formId, page, totalPages, validate, parentErrorClass) { 1391 return RSFormPro.Pages.change(formId, page, totalPages, validate, parentErrorClass); 1392} 1393 1394function rsfp_hidePage(thePage) { 1395 return RSFormPro.Pages.hide(thePage); 1396} 1397 1398function rsfp_showPage(thePage) { 1399 return RSFormPro.Pages.show(thePage); 1400} 1401 1402function rsfp_checkValidDate(fieldName) { 1403 return RSFormPro.disableInvalidDates(fieldName); 1404} 1405 1406function rsfp_addCondition(formId, name, fnCondition) { 1407 return RSFormPro.Conditions.add(formId, name, fnCondition); 1408} 1409 1410function rsfp_runAllConditions(formId) { 1411 return RSFormPro.Conditions.runAll(formId); 1412} 1413 1414function rsfp_setCalculationsEvents(formId, fields) { 1415 return RSFormPro.Calculations.addEvents(formId, fields); 1416} 1417 1418function getElementsByClassName(className, tag, elm) { 1419 return RSFormProUtils.getElementsByClassName(className, tag, elm); 1420} 1421 1422function buildXmlHttp() { 1423 return RSFormPro.Ajax.getXHR(); 1424} 1425 1426function ajaxDisplayValidationErrors(formComponents, task, formId, data) { 1427 return RSFormPro.Ajax.displayValidationErrors(formComponents, task, formId, data); 1428} 1429 1430function ajaxValidation(form, page, parentErrorClass) { 1431 return RSFormPro.Ajax.validate(form, page, parentErrorClass); 1432}
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.