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; 13RSFormPro.usePositioning = false; 14 15/* Handle HTML5 form fields validation for the forms without AjaxValidation enabled */ 16RSFormPro.setHTML5Validation = function (formId, isDisabledSubmit, errorClasses, totalPages) { 17 var parentErrorClass = errorClasses.parent; 18 var fieldErrorClass = errorClasses.field; 19 var submitElement = RSFormPro.getElementByType(formId, 'submit'); 20 var i, j; 21 for (i = 0; i < submitElement.length; i++) { 22 if (RSFormProUtils.hasClass(submitElement[i],'rsform-submit-button')) { 23 RSFormProUtils.addEvent(submitElement[i], 'click', (function (event) { 24 var errorElements = RSFormPro.HTML5.validation(formId); 25 if (errorElements.length) { 26 var errorPagesFound = []; 27 for (j = 0; j < errorElements.length; j++) { 28 RSFormProUtils.addClass(errorElements[j], 'rsform-error'); 29 30 if (document.getElementById('component' + errorElements[j].componentId)) { 31 document.getElementById('component' + errorElements[j].componentId).className = 'formError'; 32 } 33 if (parentErrorClass) { 34 try { 35 var block = RSFormPro.getBlock(formId, RSFormProUtils.getAlias(errorElements[j].field.getAttribute('id'))); 36 37 RSFormProUtils.addClass(block[0], parentErrorClass); 38 } catch (err) {} 39 } 40 41 if (totalPages > 0) { 42 errorPagesFound.push(errorElements[j].page); 43 } 44 } 45 46 if (totalPages > 0 && errorPagesFound.length) { 47 var firstErrorPage = Math.min.apply(null, errorPagesFound); 48 RSFormPro.Pages.change(formId, firstErrorPage, totalPages, false, errorClasses) 49 } 50 51 if (RSFormPro.scrollToError){ 52 RSFormPro.gotoErrorElement(formId); 53 } 54 55 if (isDisabledSubmit) { 56 for (j = 0; j < submitElement.length; j++) { 57 submitElement[j].disabled = false; 58 } 59 } 60 61 event.preventDefault(); 62 } else { 63 if (isDisabledSubmit) { 64 RSFormPro.submitForm(this.form); 65 } 66 } 67 })); 68 } 69 } 70}; 71 72RSFormPro.formEvents = {}; 73 74RSFormPro.addFormEvent = function(formId, func) { 75 if (typeof RSFormPro.formEvents[formId] !== 'object') { 76 RSFormPro.formEvents[formId] = []; 77 } 78 79 RSFormPro.formEvents[formId].push(func); 80}; 81 82RSFormPro.submitFormCount = 0; 83 84RSFormPro.submitForm = function(form) { 85 var formId = form.elements['form[formId]'].value; 86 var func; 87 88 if (typeof RSFormPro.formEvents[formId] === 'object' && RSFormPro.formEvents[formId].length > 0) { 89 func = RSFormPro.formEvents[formId].shift() 90 if (typeof func === 'function') { 91 func(); 92 93 return false; 94 } 95 } 96 97 // Need this to stop infinite loops on Chrome, for now 98 if (RSFormPro.submitFormCount > 0) 99 { 100 RSFormPro.submitFormCount = 0; 101 return; 102 } 103 RSFormPro.submitFormCount++; 104 105 // if the submit button or any other element has the id submit the form.submit() function is overwritten 106 RSFormPro.triggerEvent(form, 'submit'); 107 if (typeof form.submit === 'function') { 108 form.submit(); 109 } else { 110 document.createElement('form').submit.call(form) 111 } 112}; 113 114/* Disable the submit button when form is submitted functions */ 115RSFormPro.setDisabledSubmit = function(formId, ajaxValidation){ 116 if (!ajaxValidation) { 117 var i, j; 118 var submitElement = RSFormPro.getElementByType(formId, 'submit'); 119 for (i = 0; i < submitElement.length; i++) { 120 if (RSFormProUtils.hasClass(submitElement[i],'rsform-submit-button')) { 121 RSFormProUtils.addEvent(submitElement[i],'click', (function(event) { 122 event.preventDefault(); 123 for (j = 0; j < submitElement.length; j++) { 124 submitElement[j].disabled = true; 125 } 126 })); 127 } 128 } 129 } 130}; 131/* Thank You Message in Popup Window functions */ 132 133RSFormPro.showThankYouPopup = function (thankYouContainer){ 134 var content = thankYouContainer.innerHTML; 135 var gotoUrl = thankYouContainer.querySelector('#rsfp-thankyou-popup-return-link').value; 136 137 // remove the html part from the layout 138 thankYouContainer.parentNode.removeChild(thankYouContainer); 139 140 RSFormProUtils.addClass(document.body, 'rsfp_popup_activated'); 141 142 var outer = document.createElement('div'); 143 outer.setAttribute('class', 'rsfp_thankyou_popup_outer');
144 outer.onclick = function() { 145 if (event && event.target && (RSFormProUtils.hasClass(event.target, 'rsfp_thankyou_popup_outer') || RSFormProUtils.hasClass(event.target, 'rsfp_thankou_popup_close_btn'))) { 146 destroyPopup(); 147 redirectUrl(); 148 } 149 }; 150 151 var inner = document.createElement('div'); 152 inner.setAttribute('class', 'rsfp_thankyou_popup_inner'); 153 inner.setAttribute('id', 'rsfp_thankyou_popup_inner'); 154 inner.innerHTML = content; 155 156 var close = document.createElement('div'); 157 close.setAttribute('class', 'rsfp_thankou_popup_close_btn'); 158 close.innerHTML = '×'; 159 160 outer.appendChild(inner); 161 inner.appendChild(close); 162 163 document.body.appendChild(outer); 164 165 document.getElementById('rsfp_thankyou_popup_inner').style.marginTop = (window.innerHeight - document.getElementById('rsfp_thankyou_popup_inner').offsetHeight) / 2 + 'px'; 166 167 var continueButton = outer.querySelector('[name=continue]'); 168 if (continueButton) { 169 continueButton.removeAttribute('onclick'); 170 continueButton.onclick = function() { 171 destroyPopup(); 172 redirectUrl(); 173 } 174 } 175 176 var redirectUrl = function() { 177 if (gotoUrl.length > 0) { 178 document.location = gotoUrl; 179 } else { 180 document.location.reload(true); 181 } 182 }; 183 184 var destroyPopup = function() { 185 RSFormProUtils.removeClass(document.body, 'rsfp_popup_activated'); 186 187 document.body.removeChild(outer); 188 }; 189}; 190 191/* Scroll to first error element */ 192RSFormPro.gotoErrorElement = function(formId){ 193 var form = RSFormPro.getForm(formId); 194 var errorElements = form.getElementsByClassName('formError'); 195 if (errorElements.length) { 196 var block = RSFormPro.findAncestor(errorElements[0], 'rsform-block'); 197 if (block) { 198 RSFormPro.scrollToElement(block); 199 } else { 200 RSFormPro.scrollToElement(errorElements[0]); 201 } 202 } 203}; 204 205RSFormPro.findAncestor = function(el, cls){ 206 while(el = el.parentElement) { 207 var elementClasses = el.className; 208 elementClasses = elementClasses.split(' '); 209 if (elementClasses.indexOf(cls) > -1) { 210 return el; 211 } 212 } 213 214 return false; 215}; 216 217/* Reset all values, used with reset button for the submit */ 218RSFormPro.resetElements = function(formId) { 219 var form = RSFormPro.getForm(formId); 220 221 if (form && form.elements.length) { 222 RSFormPro.resetValues(form.elements); 223 } 224}; 225 226/* ScrollTo functions */ 227RSFormPro.scrollToElement = function(element){ 228 var to = element.offsetTop; 229 var scrollTop = window.pageYOffset || document.documentElement.scrollTop; 230 var documentView = window.innerHeight + scrollTop; 231 232 // this is more specific for the modern browsers 233 if (typeof element.getBoundingClientRect === 'function') { 234 to = element.getBoundingClientRect().top + scrollTop; 235 } 236 237 if (to < scrollTop || to > documentView) { 238 RSFormPro.scrollTo(to, 300); 239 } 240}; 241 242RSFormPro.scrollTo = function(to, duration) { 243 if (duration <= 0) return; 244 var elementScrollTop = window.pageYOffset ? window.pageYOffset : document.documentElement.scrollTop; 245 var difference = to - elementScrollTop; 246 var perTick = difference / duration * 10; 247 248 window.setTimeout(function() { 249 var limitControl; 250 limitControl = window.pageYOffset ? window.pageYOffset : document.documentElement.scrollTop; 251 limitControl = limitControl + perTick; 252 window.scrollTo(0, limitControl); 253 // if the element has been reached or the scroll is at the bottom of the page no need to continue 254 if (limitControl == to) return; 255 256 RSFormPro.scrollTo(to, duration - 10); 257 }, 10); 258}; 259 260/* Field specific functions */ 261 262RSFormPro.refreshCaptcha = function(componentId, captchaPath) { 263 if (!captchaPath) { 264 captchaPath = 'index.php?option=com_rsform&task=captcha&format=image&componentId=' + componentId; 265 } 266 document.getElementById('captcha' + componentId).src = captchaPath + '&' + Math.random(); 267 document.getElementById('captchaTxt' + componentId).value = ''; 268 document.getElementById('captchaTxt' + componentId).focus(); 269}; 270 271RSFormPro.geoLocationTimeouts = {}; 272 273RSFormPro.initGeoLocation = function(term, id, mapid, map, marker, geocoder, type) { 274 var content = document.getElementById('rsform_geolocation'+id); 275 var address = document.getElementById(mapid).clientWidth; 276 277 document.getElementById('rsform_geolocation'+id).style.width = address+'px'; 278 document.getElementById('rsform_geolocation'+id).style.display = 'none'; 279 document.getElementById('rsform_geolocation'+id).innerHTML = ''; 280 281 if (typeof RSFormPro.geoLocationTimeouts[id] !== 'undefined') 282 { 283 window.clearTimeout(RSFormPro.geoLocationTimeouts[id]); 284 } 285 286 if (term != '') { 287 RSFormPro.geoLocationTimeouts[id] = window.setTimeout(function(){ 288 geocoder.geocode( {'address': term }, function(results, status) { 289 if (status == 'OK') { 290 for (var i=0; i<results.length; i++) { 291 var item = results[i];
292 var theli = document.createElement('li'); 293 var thea = document.createElement('a'); 294 295 thea.setAttribute('href','javascript:void(0)'); 296 thea.innerHTML = item.formatted_address; 297 298 RSFormProUtils.addEvent(thea,'click', (function() { 299 var mapValue = type ? item.formatted_address : item.geometry.location.lat().toFixed(5) + ',' + item.geometry.location.lng().toFixed(5); 300 var mapId = mapid; 301 var location = new google.maps.LatLng(item.geometry.location.lat().toFixed(5), item.geometry.location.lng().toFixed(5)); 302 303 return function() { 304 document.getElementById(mapId).value = mapValue; 305 marker.setPosition(location); 306 map.setCenter(location); 307 document.getElementById('rsform_geolocation'+id).style.display = 'none'; 308 } 309 })()); 310 311 theli.appendChild(thea); 312 content.appendChild(theli); 313 } 314 315 document.getElementById('rsform_geolocation'+id).style.display = ''; 316 } 317 }); 318 }, 500); 319 } 320}; 321 322RSFormPro.initGoogleMaps = function() { 323 324}
325RSFormPro.googleMapIds = []; 326 327RSFormPro.requestLocation = function() { 328 if (navigator && navigator.geolocation && navigator.geolocation.getCurrentPosition) { 329 navigator.geolocation.getCurrentPosition(function(position){ 330 var id, map, marker; 331 332 for (var i = 0; i < RSFormPro.googleMapIds.length; i++) 333 { 334 id = RSFormPro.googleMapIds[i]; 335 map = window['rsformmap' + id]; 336 marker = window['rsformmarker' + id]; 337 338 map.setCenter({lat: position.coords.latitude, lng: position.coords.longitude}); 339 marker.setPosition({lat: position.coords.latitude, lng: position.coords.longitude}); 340 google.maps.event.trigger(marker, 'drag'); 341 } 342 }); 343 } 344}; 345 346RSFormPro.disableInvalidDates = function(fieldName) { 347 var theDate = new Date(), 348 day, 349 index; 350 351 for (day = 1; day <= 31; day++) { 352 var year = parseInt(document.getElementById(fieldName + 'y').value); 353 var month = parseInt(document.getElementById(fieldName + 'm').value) - 1; 354 355 index = day - 1; 356 if (document.getElementById(fieldName + 'd').options[0].value == '') { 357 index++; 358 } 359 document.getElementById(fieldName + 'd').options[index].disabled = false; 360 if (!isNaN(year) && !isNaN(month)) { 361 if (typeof theDate.__msh_oldSetFullYear == 'function') { 362 theDate.__msh_oldSetFullYear(year, month, day); 363 } else { 364 theDate.setFullYear(year, month, day); 365 } 366 367 if (theDate.getDate() != day || theDate.getMonth() != month) { 368 document.getElementById(fieldName + 'd').options[index].disabled = true; 369 } 370 } 371 } 372 if (document.getElementById(fieldName + 'd').options[document.getElementById(fieldName + 'd').selectedIndex].disabled == true) { 373 for (day = 31; day >= 28; day--) { 374 index = day - 1; 375 if (document.getElementById(fieldName + 'd').options[0].value == '') { 376 index++; 377 } 378 if (document.getElementById(fieldName + 'd').options[index].disabled == false) { 379 document.getElementById(fieldName + 'd').value = day; 380 break; 381 } 382 } 383 } 384}; 385 386RSFormPro.addMoreFiles = function(button) { 387 var previousElement = button.previousElementSibling; 388 var previousInputs = previousElement.getElementsByTagName('input'); 389 var originalInput; 390 if (previousInputs.length) 391 { 392 for (var k = 0; k < previousInputs.length; k++) 393 { 394 if (previousInputs[k].type && previousInputs[k].type.toUpperCase() === 'FILE') 395 { 396 originalInput = previousInputs[k]; 397 break; 398 } 399 } 400 } 401 402 var clone = previousElement.cloneNode(true); 403 var inputs = clone.getElementsByTagName('input'); 404 if (inputs.length) 405 { 406 for (var i = 0; i < inputs.length; i++) 407 { 408 if (inputs[i].type && inputs[i].type.toUpperCase() === 'FILE') 409 { 410 var fieldName = inputs[i].getAttribute('id'); 411 inputs[i].value = ''; 412 413 if (originalInput) 414 { 415 RSFormProUtils.addEvent(inputs[i], 'change', function() { 416 RSFormPro.triggerEvent(originalInput, 'change'); 417 }); 418 } 419 } 420 } 421 } 422 423 var images = clone.getElementsByTagName('img'); 424 if (images.length) 425 { 426 for (var j = 0; j < images.length; j++) 427 { 428 if (RSFormProUtils.hasClass(images[j], 'rsfp-image-polaroid')) 429 { 430 images[j].parentNode.parentNode.removeChild(images[j].parentNode); 431 } 432 } 433 } 434 435 button.parentNode.appendChild(clone); 436 437 var maxFiles = parseInt(button.getAttribute('data-rsfp-maxfiles')); 438 if (maxFiles > 0) 439 { 440 if (RSFormPro.getFieldsByName(button.getAttribute('data-rsfp-formid'), fieldName).length / 2 >= maxFiles) 441 { 442 button.disabled = true; 443 } 444 } 445}; 446 447RSFormPro.openImageModal = function(element) { 448 var modal = document.createElement('div'); 449 modal.setAttribute('class', 'rsfp-modal'); 450 451 var close = document.createElement('span'); 452 close.innerHTML = '×'; 453 close.setAttribute('class', 'rsfp-modal-close-button'); 454 modal.onclick = close.onclick = function() { 455 modal.parentNode.removeChild(modal); 456 }; 457 458 var img = document.createElement('img'); 459 img.setAttribute('class', 'rsfp-modal-image'); 460 img.setAttribute('src', element.getAttribute('src')); 461 462 var caption = document.createElement('div'); 463 caption.setAttribute('class', 'rsfp-modal-caption'); 464 caption.innerHTML = element.getAttribute('alt'); 465 466 modal.appendChild(close); 467 modal.appendChild(img); 468 modal.appendChild(caption); 469 470 document.getElementsByTagName('body')[0].appendChild(modal); 471 472 modal.style.display = 'block'; 473} 474 475RSFormPro.loadImage = function(input) { 476 if ('files' in input && typeof FileReader === 'function') 477 { 478 var file, reader; 479 480 var images = input.parentNode.querySelectorAll('.rsfp-image-container'); 481 482 for (var j = 0; j < images.length; j++) 483 { 484 images[j].parentNode.removeChild(images[j]); 485 } 486 487 for (var i = 0; i < input.files.length; i++) 488 { 489 file = input.files[i]; 490 491 reader = new FileReader(); 492 reader.onload = function(e) { 493 var div = document.createElement('div'); 494 div.setAttribute('class', 'rsfp-image-container'); 495 496 var img = document.createElement('img'); 497 img.setAttribute('src', e.target.result); 498 img.setAttribute('alt', file.name); 499 img.setAttribute('title', file.name); 500 img.setAttribute('class', 'rsfp-image-polaroid'); 501 img.onerror = function() { 502 img.src = "data:image/svg+xml,%3Csvg role='img' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 512 512'%3E%3Cpath fill='currentColor' d='M256 8C119.034 8 8 119.033 8 256s111.034 248 248 248 248-111.034 248-248S392.967 8 256 8zm130.108 117.892c65.448 65.448 70 165.481 20.677 235.637L150.47 105.216c70.204-49.356 170.226-44.735 235.638 20.676zM125.892 386.108c-65.448-65.448-70-165.481-20.677-235.637L361.53 406.784c-70.203 49.356-170.226 44.736-235.638-20.676z'%3E%3C/path%3E%3C/svg%3E";
503 img.onclick = false; 504 }; 505 img.onclick = function() { 506 RSFormPro.openImageModal(this); 507 }; 508 509 div.appendChild(img); 510 511 input.parentNode.insertBefore(div, input.nextSibling); 512 }; 513 514 reader.readAsDataURL(file); 515 } 516 } 517}; 518 519/* Number functions */ 520 521RSFormPro.formatNumber = function(number, decimals, dec_point, thousands_sep) { 522 var n = number, prec = decimals; 523 n = !isFinite(+n) ? 0 : +n; 524 prec = !isFinite(+prec) ? 0 : Math.abs(prec); 525 var sep = (typeof thousands_sep == "undefined") ? ',' : thousands_sep; 526 var dec = (typeof dec_point == "undefined") ? '.' : dec_point; 527 528 var s = (prec > 0) ? n.toFixed(prec) : Math.round(n).toFixed(prec); //fix for IE parseFloat(0.55).toFixed(0) = 0; 529 530 var abs = Math.abs(n).toFixed(prec); 531 var _, i; 532 533 if (abs >= 1000) { 534 _ = abs.split(/\D/); 535 i = _[0].length % 3 || 3; 536 537 _[0] = s.slice(0,i + (n < 0)) + 538 _[0].slice(i).replace(/(\d{3})/g, sep+'$1'); 539 540 s = _.join(dec); 541 } else { 542 s = s.replace('.', dec); 543 } 544 545 return s; 546}; 547 548RSFormPro.toNumber = function(number, decimal, thousands, decimals) { 549 // Remove decimals first 550 if (parseInt(decimals) > 0 && number.lastIndexOf(decimal) > -1) { 551 var index = number.lastIndexOf(decimal); 552 number = number.substring(0, index) + 'DECIMALS' + number.substring(index + 1); 553 } 554 555 // Remove thousands separator 556 if (number.indexOf(thousands) > -1) { 557 number = number.split(thousands).join(''); 558 } 559 560 number = number.split('DECIMALS').join('.'); 561 return parseFloat(number); 562}; 563 564/* Form and element functions */ 565 566RSFormPro.getForm = function(formId) { 567 if (typeof RSFormPro.Forms[formId] == 'undefined') { 568 var formIds = document.getElementsByName('form[formId]'); 569 for (var i=0; i<formIds.length; i++) 570 { 571 if (parseInt(formIds[i].value) != parseInt(formId)) 572 continue; 573 574 var form = formIds[i].parentNode; 575 if (form.tagName == 'FORM' || form.nodeName == 'FORM') { 576 RSFormPro.Forms[formId] = form; 577 return form; 578 } 579 580 while (form.parentNode) 581 { 582 form = form.parentNode; 583 if (form.tagName == 'FORM' || form.nodeName == 'FORM') { 584 RSFormPro.Forms[formId] = form; 585 return form; 586 } 587 } 588 } 589 } 590 591 return RSFormPro.Forms[formId]; 592}; 593 594RSFormPro.getValue = function(formId, name) { 595 var form = RSFormPro.getForm(formId); 596 var values = []; 597 598 if (typeof form != 'undefined') 599 { 600 for (var i = 0; i < form.elements.length; i++) 601 { 602 var element = form.elements[i]; 603 var tagName = element.tagName || element.nodeName; 604 605 switch (tagName) 606 { 607 case 'INPUT': 608 if (element.type) 609 switch (element.type.toUpperCase()) 610 { 611 case 'TEXT': 612 case 'NUMBER': 613 case 'HIDDEN': 614 if (!element.name || element.name != 'form[' + name + ']') continue; 615 616 if (typeof RSFormPro.YUICalendar != 'undefined' && 617 typeof RSFormPro.YUICalendar.calendars[formId] != 'undefined' && 618 typeof RSFormPro.YUICalendar.calendars[formId][name] != 'undefined') 619 { 620 var selectedDate = new Date(RSFormPro.YUICalendar.calendars[formId][name].getSelectedDates()[0]); 621 return (selectedDate.getTime() / 1000).toString(); 622 } 623 624 if (typeof RSFormPro.jQueryCalendar != 'undefined' && 625 typeof RSFormPro.jQueryCalendar.calendars[formId] != 'undefined' && 626 typeof RSFormPro.jQueryCalendar.calendars[formId][name] != 'undefined') 627 { 628 var tmpDate = RSFormPro.jQueryCalendar.calendars[formId][name].calendarInstance.getValue(); 629 630 if (RSFormPro.jQueryCalendar.calendars[formId][name].hiddenFormat.indexOf('HH:mm') === -1) 631 { 632 tmpDate.setHours(0, 0, 0, 0); 633 } 634 635 return parseInt(tmpDate.getTime() / 1000).toString(); 636 } 637 638 if (element.hasOwnProperty('rsfpGetValue')) 639 { 640 return element.rsfpGetValue(); 641 } 642 643 return element.value; 644 break; 645 646 case 'RADIO': 647 if (!element.name || (element.name !== 'form[' + name + ']' && element.name.substring(0, ('form[' + name + ']').length) !== 'form[' + name + ']')) continue; 648 649 if (element.checked) { 650 values.push(element.value); 651 } 652 break; 653 654 case 'CHECKBOX': 655 if (!element.name || element.name != 'form[' + name + '][]') continue; 656 if (element.checked == true) { 657 values.push(element.value); 658 } 659 break; 660 } 661 break; 662 663 case 'SELECT': 664 if (!element.name || element.name != 'form[' + name + '][]') continue; 665 666 if (element.options) 667 for (var o=0; o<element.options.length; o++) 668 if (element.options[o].selected) 669 { 670 values.push(element.options[o].value); 671 } 672 break; 673 } 674 } 675 } 676 677 return values; 678}; 679 680RSFormPro.getElementByType = function(formId, type) { 681 var form = RSFormPro.getForm(formId); 682 type = type.toUpperCase(); 683 var elements = []; 684 685 if (typeof form != 'undefined') 686 { 687 for (var i = 0; i < form.elements.length; i++) 688 { 689 var element = form.elements[i]; 690 var tagName = element.tagName || element.nodeName; 691 switch (tagName) 692 { 693 case 'INPUT': 694 case 'BUTTON': 695 if (element.type.toUpperCase() == type) { 696 elements.push(element); 697 } 698 break; 699 700 case 'SELECT': 701 case 'TEXTAREA': 702 if (type == 'SELECT' || type == 'TEXTAREA') { 703 elements.push(element); 704 } 705 break; 706 } 707 } 708 } 709 710 return elements; 711}; 712 713RSFormPro.resettingValues = false; 714 715RSFormPro.resetValues = function(items) { 716 if (RSFormPro.resettingValues) 717 { 718 return true; 719 } 720 721 var element, tagName; 722 try 723 { 724 for (var i = 0; i < items.length; i++) 725 { 726 element = items[i]; 727 tagName = element.tagName || element.nodeName; 728 729 switch (tagName) 730 { 731 case 'INPUT': 732 if (element.type) 733 { 734 switch (element.type.toUpperCase()) 735 { 736 case 'CHECKBOX': 737 case 'RADIO': 738 if (element.defaultChecked !== element.checked) 739 { 740 element.checked = element.defaultChecked; 741 RSFormPro.triggerEvent(element, 'change'); 742 } 743 break; 744 745 case 'NUMBER': 746 case 'TEXT': 747 if (element.defaultValue !== element.value) 748 { 749 element.value = element.defaultValue; 750
751 if (element.id) 752 { 753 // Range Slider 754 if (element.id.indexOf('rs-range-slider') === 0 && typeof jQuery !== 'undefined') 755 { 756 jQuery(element).data('ionRangeSlider').reset(); 757 } 758 759 // Date and Time Picker 760 if (element.id.indexOf('txtjQcal') === 0 && typeof jQuery !== 'undefined' && typeof RSFormPro.jQueryCalendar !== 'undefined') 761 { 762 jQuery(element).datetimepicker('reset'); 763 } 764 765 // Calendar 766 if (element.id.indexOf('txtcal') === 0 && typeof RSFormPro.YUICalendar !== 'undefined') 767 { 768 var match = element.id.match(/^txtcal([0-9]+)_[0-9]+$/); 769 if (match.length === 2) 770 { 771 var formId = match[1]; 772 var calendarName = element.name.match(/^form\[(.*)\]$/)[1]; 773 774 if (typeof RSFormPro.YUICalendar.calendars[formId][calendarName] !== 'undefined') 775 { 776 RSFormPro.YUICalendar.calendars[formId][calendarName].reset(); 777 } 778 } 779 } 780 } 781 782 RSFormPro.triggerEvent(element, 'change'); 783 RSFormPro.triggerEvent(element, 'input'); 784 } 785 break; 786 } 787 } 788 break; 789 790 case 'TEXTAREA': 791 if (element.defaultValue !== element.value) 792 { 793 element.value = element.defaultValue; 794 795 RSFormPro.triggerEvent(element, 'change'); 796 RSFormPro.triggerEvent(element, 'input'); 797 } 798 break; 799 800 case 'SELECT': 801 if (element.options) 802 { 803 var needsChange = false; 804 var unselected = []; 805 for (var o = 0; o < element.options.length; o++) { 806 if (element.options[o].defaultSelected !== element.options[o].selected) 807 { 808 needsChange = true; 809 element.options[o].selected = element.options[o].defaultSelected; 810 } 811 812 if (!element.options[o].defaultSelected) { 813 unselected.push(o); 814 } 815 } 816 817 // in safari something must be selected 818 if (element.options.length === unselected.length) { 819 element.selectedIndex = 0; 820 } 821 822 if (needsChange) 823 { 824 RSFormPro.triggerEvent(element, 'change'); 825 } 826 } 827 break; 828 } 829 } 830 } 831 catch (err) {} 832}; 833 834RSFormPro.triggerEvent = function(element, type) { 835 try { 836 element.dispatchEvent(new Event(type)); 837 } catch (e) {} 838}; 839 840RSFormPro.isChecked = function(formId, name, value) { 841 var isChecked = false; 842 var form = RSFormPro.getForm(formId); 843 844 if (typeof form != 'undefined') 845 { 846 primary_loop: 847 for (var i=0; i<form.elements.length; i++) 848 { 849 var element = form.elements[i]; 850 var tagName = element.tagName || element.nodeName; 851 852 switch (tagName) 853 { 854 case 'INPUT': 855 if (element.type) 856 switch (element.type.toUpperCase()) 857 { 858 default: 859 if (!element.name || element.name != 'form[' + name + ']') continue; 860 if (!element.value) continue; 861 862 if (element.value == value) 863 { 864 isChecked = true; 865 break primary_loop; 866 } 867 868 break; 869 case 'RADIO': 870 if (!element.name || element.name != 'form[' + name + ']') continue; 871 if (element.checked == true && element.value == value) 872 { 873 isChecked = true; 874 break primary_loop; 875 } 876 break; 877 878 case 'CHECKBOX': 879 if (!element.name || element.name != 'form[' + name + '][]') continue; 880 if (element.checked == true && element.value == value) 881 { 882 isChecked = true; 883 break primary_loop; 884 } 885 break; 886 } 887 break; 888 889 case 'SELECT': 890 if (!element.name || element.name != 'form[' + name + '][]') continue; 891 892 if (element.options) 893 for (var o=0; o<element.options.length; o++) 894 if (element.options[o].selected && element.options[o].value == value) 895 { 896 isChecked = true; 897 break primary_loop; 898 } 899 break; 900 } 901 } 902 } 903 904 return isChecked; 905};
906 907RSFormPro.getBlock = function(formId, block) { 908 var form = RSFormPro.getForm(formId); 909 var possible = false; 910 var blocks, current_block; 911 912 if (typeof form != 'undefined') { 913 if (blocks = getElementsByClassName('rsform-block')) { 914 for (i=0; i<blocks.length; i++) { 915 var classes = blocks[i].className.split(' '); 916 for (c=0; c<classes.length; c++) { 917 if (classes[c] == 'rsform-block-' + block) { 918 if (blocks[i].parentNode) { 919 current_block = blocks[i]; 920 if (current_block == form) 921 return [ blocks[i] ]; 922 923 while (current_block.parentNode) { 924 current_block = current_block.parentNode; 925 if (current_block == form) 926 return [ blocks[i] ]; 927 } 928 } 929 930 possible = [ blocks[i] ]; 931 } 932 } 933 } 934 } 935 } 936 937 return possible; 938}; 939 940RSFormPro.getFieldsByName = function(formId, name) { 941 var form = RSFormPro.getForm(formId); 942 var results = []; 943 var pushed = false; 944 945 if (typeof form != 'undefined') { 946 for (var i=0; i<form.elements.length; i++) { 947 var element = form.elements[i]; 948 pushed = false; 949 if (element.name && ( 950 // single fields 951 element.name == 'form[' + name + ']' || 952 // multiple fields 953 element.name == 'form[' + name + '][]' || 954 // new field - Birthday field 955 element.name == 'form[' + name + '][d]' || 956 element.name == 'form[' + name + '][m]' || 957 element.name == 'form[' + name + '][y]' 958 )) { 959 results.push(element); 960 pushed = true; 961 } 962 963 if (!pushed) 964 { 965 if (element.name && element.getAttribute('data-rsfpsurveytable-answer') && element.name.substring(0, ('form[' + name + ']').length) === 'form[' + name + ']') 966 { 967 results.push(element); 968 } 969 } 970 971 if (pushed) { 972 // for calendar 973 if (element.id && element.id.indexOf('txtcal') > -1) { 974 var suffix = element.id.replace('txtcal', ''); 975 if (document.getElementById('btn' + suffix)) 976 { 977 results.push(document.getElementById('btn' + suffix)); 978 } 979 } 980 // for labels (radio, checkbox) 981 var labels = form.getElementsByTagName('label'); 982 for (var l=0; l<labels.length; l++) { 983 if (labels[l].htmlFor && labels[l].htmlFor == element.id) 984 results.push(labels[l]); 985 } 986 } 987 } 988 } 989 990 return results; 991}; 992 993RSFormPro.showCounter = function(element, id) { 994 var current = element.value.length; 995 var result; 996 if (element.maxLength > 0) 997 { 998 result = current + '/' + element.maxLength; 999 } 1000 else 1001 { 1002 result = current; 1003 } 1004 1005 document.getElementById('rsfp-counter-' + id).innerText = result; 1006}; 1007 1008RSFormPro.limitSelections = function(formId, field, max) {
1009 RSFormProUtils.addEvent(window, 'load', function() { 1010 var fields = RSFormPro.getFieldsByName(formId, field); 1011 var objects = []; 1012 var i; 1013 var tagName; 1014 1015 if (!fields || !fields.length) { 1016 return; 1017 } 1018 1019 for (i = 0; i < fields.length; i++) { 1020 tagName = fields[i].tagName || fields[i].nodeName; 1021 tagName = tagName.toUpperCase(); 1022 1023 if (tagName === 'INPUT' && fields[i].type && fields[i].type.toUpperCase() === 'CHECKBOX' && !fields[i].disabled) { 1024 objects.push(fields[i]); 1025 } 1026 } 1027 1028 if (!objects.length) { 1029 return; 1030 } 1031 1032 function limitSelections() { 1033 var values = RSFormProUtils.getChecked(objects); 1034 RSFormProUtils.remAttr(objects, 'disabled'); 1035 if (values && values.length > 0 && values.length >= max) { 1036 RSFormProUtils.setAttr(RSFormProUtils.getUnchecked(objects), 'disabled', true); 1037 } 1038 } 1039 1040 for (i = 0; i < objects.length; i++) { 1041 RSFormProUtils.addEvent(objects[i], 'change', limitSelections); 1042 } 1043 1044 limitSelections(); 1045 }); 1046}; 1047 1048/*HTML5 simulators*/ 1049 1050RSFormPro.HTML5 = { 1051 validation: function(formId){ 1052 var form = RSFormPro.getForm(formId); 1053 var errorElements = []; 1054 var html5types = ['number', 'email', 'range', 'url', 'tel']; 1055 var multipleTypes = ['radio']; 1056 1057 var checkValidityExists = true; 1058 var checkValidityFunction; 1059 var needsCheck; 1060 var options; 1061 var page = 0; 1062 var componentId; 1063 var elementId; 1064 var match; 1065 1066 if (form.elements.length) { 1067 for (var i = 0; i < form.elements.length; i++) { 1068 if (!checkValidityExists) { 1069 break; 1070 } 1071 1072 needsCheck = false; 1073 checkValidityFunction = false; 1074 1075 // if the multiple form is present and also validation we will need to find in which page the element is located 1076 if (form.elements[i].type === 'button') { 1077 var onclick = form.elements[i].getAttribute('onclick'); 1078 if (typeof onclick == 'string' && (onclick.indexOf('rsfp_changePage') > -1 || onclick.indexOf('RSFormPro.Pages.change') > -1)) { 1079 var countCommas = 0; 1080 var pos = onclick.indexOf(','); 1081 while (pos > -1) { 1082 ++countCommas; 1083 pos = onclick.indexOf(',', ++pos); 1084 } 1085 1086 if (countCommas > 2) { 1087 page++; 1088 } 1089 } 1090 } 1091 if (form.elements[i].getAttribute('data-rsfp-phonenumber')) 1092 { 1093 options = JSON.parse(form.elements[i].getAttribute('data-rsfp-phonenumber')); 1094 needsCheck = form.elements[i].value.length > 0; 1095 if (options['validation'] === 'precise') 1096 { 1097 checkValidityFunction = function(el) { return intlTelInput.getInstance(el).isValidNumberPrecise(); } 1098 } 1099 else 1100 { 1101 checkValidityFunction = function(el) { return intlTelInput.getInstance(el).isValidNumber(); } 1102 } 1103 } 1104 else 1105 { 1106 needsCheck = html5types.indexOf(form.elements[i].type) > -1; 1107 if (typeof(form.elements[i].checkValidity) === 'function') 1108 { 1109 checkValidityFunction = function(el) { return el.checkValidity() }; 1110 } 1111 } 1112 if (needsCheck) { 1113 if (typeof(checkValidityFunction) === 'function' && checkValidityExists) { 1114 if (!checkValidityFunction(form.elements[i])) { 1115 var elementObj = { 1116 field: form.elements[i], 1117 page: page 1118 }; 1119 // try to get the componentId 1120 elementId = form.elements[i].getAttribute('id'); 1121 if (multipleTypes.indexOf(form.elements[i].type) > -1) 1122 { 1123 if (match = form.elements[i].getAttribute('name').match(/form\[(.*)\]/)) 1124 { 1125 elementId = match[1]; 1126 } 1127 } 1128 componentId = RSFormPro.HTML5.getComponentId(formId, elementId); 1129 1130 if (componentId) { 1131 elementObj.componentId = componentId; 1132 } 1133 1134 errorElements.push(elementObj); 1135 } 1136 } else { 1137 checkValidityExists = false; 1138 } 1139 } 1140 } 1141 } 1142 return errorElements; 1143 }, 1144 1145 componentIds: {}, 1146 1147 getComponentId: function(formId, elementAlias) { 1148 if (typeof RSFormPro.HTML5.componentIds[formId] == 'undefined') { 1149 RSFormPro.HTML5.componentIds[formId] = {}; 1150 } 1151 1152 if (typeof RSFormPro.HTML5.componentIds[formId][elementAlias] == 'undefined') { 1153 RSFormPro.HTML5.componentIds[formId][elementAlias] = false; 1154 var block = RSFormPro.getBlock(formId, RSFormProUtils.getAlias(elementAlias)); 1155 1156 if (typeof block[0] !== 'undefined') { 1157 var componentIdBlock; 1158 1159 componentIdBlock = RSFormProUtils.getElementsByClassName('formNoError', 'span', block[0]); 1160 if (componentIdBlock.length === 0) { 1161 componentIdBlock = RSFormProUtils.getElementsByClassName('formError', 'span', block[0]); 1162 } 1163 1164 if (componentIdBlock.length > 0) { 1165 var componentId = componentIdBlock[0].getAttribute('id');
1166 RSFormPro.HTML5.componentIds[formId][elementAlias] = componentId.replace('component', ''); 1167 } 1168 } 1169 } 1170 1171 return RSFormPro.HTML5.componentIds[formId][elementAlias]; 1172 } 1173}; 1174 1175/* Pagination functions */ 1176 1177RSFormPro.Pages = { 1178 change: function(formId, page, totalPages, validate, errorClasses) { 1179 // callback functions if next page is clicked 1180 var direction = RSFormPro.Pages.checkDirection(formId, page); 1181 if (direction == 'next') { 1182 RSFormPro.callbacks.runCallback(formId, 'nextPage'); 1183 } 1184 RSFormPro.callbacks.runCallback(formId, 'changePage'); 1185 1186 var thePage; 1187 1188 if (validate) { 1189 var form = RSFormPro.getForm(formId); 1190 if (!RSFormPro.Ajax.validate(form, page, errorClasses, totalPages)) { 1191 return false; 1192 } 1193 } 1194 1195 for (var i = 0; i <= totalPages; i++) { 1196 thePage = document.getElementById('rsform_' + formId + '_page_' + i); 1197 if (thePage) { 1198 RSFormPro.Pages.hide(thePage); 1199 } 1200 } 1201 1202 thePage = document.getElementById('rsform_' + formId + '_page_' + page); 1203 if (thePage) { 1204 RSFormPro.Pages.show(thePage); 1205 try { 1206 var func = window["rsfp_showProgress_" + formId]; 1207 if (typeof func == "function") { 1208 func(page); 1209 } 1210 } 1211 catch (err) {} 1212 } 1213 }, 1214 hide: function(thePage) { 1215 RSFormProUtils.addClass(thePage, 'formHidden'); 1216 }, 1217 show: function(thePage) { 1218 RSFormProUtils.removeClass(thePage, 'formHidden'); 1219 }, 1220 1221 checkDirection : function(formId, page) { 1222 var base = RSFormPro.Pages; 1223 if (typeof base.history[formId] == 'undefined') { 1224 base.history[formId] = page; 1225 return 'next'; 1226 } else { 1227 var direction; 1228 if (base.history[formId] <= page ) { 1229 direction = 'next'; 1230 } else { 1231 direction = 'prev'; 1232 } 1233 base.history[formId] = page; 1234 1235 return direction; 1236 } 1237 }, 1238 history: {} 1239}; 1240 1241/* Condition functions */ 1242RSFormPro.Conditions = { 1243 add: function(formId, name, fnCondition) { 1244 var form = RSFormPro.getForm(formId); 1245 1246 if (typeof form != 'undefined') { 1247 for (var i = 0; i < form.elements.length; i++) { 1248 var element = form.elements[i]; 1249 if (element.name && (element.name == 'form[' + name + ']' || element.name == 'form[' + name + '][]')) { 1250 RSFormProUtils.addEvent(element, 'change', function() { 1251 fnCondition(); 1252 }); 1253 } 1254 } 1255 } 1256 }, 1257 run: function(condition) { 1258 var formId = condition.form_id, 1259 conditions = [], 1260 items = [], 1261 detail, isChecked, displayValue, match; 1262 1263 var i, c; 1264 1265 if (typeof condition.details === 'object') 1266 { 1267 for (i = 0; i < condition.details.length; i++) 1268 { 1269 detail = condition.details[i]; 1270 isChecked = RSFormPro.isChecked(formId, detail.ComponentName, detail.value); 1271 conditions.push(isChecked === (detail.operator === 'is')); 1272 } 1273 1274 items = []; 1275 1276 if (condition.ComponentNames) 1277 { 1278 for (c = 0; c < condition.ComponentNames.length; c++) 1279 { 1280 if (parseInt(condition.block) === 1) 1281 { 1282 items = items.concat(RSFormPro.getBlock(formId, RSFormProUtils.getAlias(condition.ComponentNames[c]))); 1283 } 1284 else 1285 { 1286 items = items.concat(RSFormPro.getFieldsByName(formId, condition.ComponentNames[c])); 1287 } 1288 } 1289 } 1290 1291 if (items.length > 0) 1292 { 1293 if (condition.condition === 'all') 1294 { 1295 // && conditions need all elements of the Array to be true -> no false in Array 1296 match = conditions.indexOf(false) === -1; 1297 } 1298 else 1299 { 1300 // || conditions need only one element to be true -> one true in array 1301 match = conditions.indexOf(true) > -1; 1302 } 1303 1304 if (match) 1305 { 1306 displayValue = condition.action === 'show' ? '' : 'none'; 1307 } 1308 else 1309 { 1310 displayValue = condition.action === 'show' ? 'none' : ''; 1311 } 1312 1313 RSFormProUtils.setDisplay(items, displayValue); 1314 if (displayValue === 'none') 1315 { 1316 if (condition.ComponentNames && condition.ComponentNames.length > 0) 1317 { 1318 for (c = 0; c < condition.ComponentNames.length; c++) 1319 { 1320 RSFormPro.resetValues(RSFormPro.getFieldsByName(formId, condition.ComponentNames[c])); 1321 } 1322 } 1323 } 1324 } 1325 } 1326 }, 1327 runAll: function(formId) { 1328 var func = window['rsfp_runAllConditions' + formId];
1329 if (typeof func === 'function') { 1330 func(); 1331 } 1332 }, 1333 addReset: function(formId) { 1334 var resetElements = RSFormPro.getElementByType(formId, 'reset'); 1335 if (resetElements.length > 0) 1336 { 1337 for (var i = 0; i < resetElements.length; i++) 1338 { 1339 RSFormProUtils.addEvent(resetElements[i], 'click', function() { 1340 window.setTimeout(function() { 1341 RSFormPro.Conditions.runAll(formId); 1342 }, 1); 1343 }); 1344 } 1345 } 1346 }, 1347 delayRun: function(formId) { 1348 var func = window['rsfp_runAllConditions' + formId]; 1349 if (typeof func === 'function') { 1350 RSFormProUtils.addEvent(window, 'load', func); 1351 } 1352 } 1353}; 1354 1355/* Calculation functions */ 1356 1357RSFormPro.Calculations = { 1358 toDays: function(seconds) { 1359 return Math.round(parseFloat(seconds) / 86400); 1360 }, 1361 toHours: function(seconds) { 1362 return Math.round(parseFloat(seconds) / 86400 * 24); 1363 }, 1364 toMinutes: function(seconds) { 1365 return Math.round(parseFloat(seconds) / 86400 * 24 * 60); 1366 }, 1367 addEvents: function(formId, fields) { 1368 RSFormProUtils.addEvent(window, 'load', function(){ 1369 RSFormPro.Calculations._addEvents(formId, fields); 1370 }); 1371 }, 1372 _addEvents: function(formId, fields) { 1373 var func = window['rsfp_Calculations' + formId]; 1374 var thefields = fields ? fields : RSFormProPrices; 1375 var event = 'change'; 1376 var objects, tagName; 1377 1378 var resetElements = RSFormPro.getElementByType(formId, 'reset'); 1379 if (resetElements.length > 0) 1380 { 1381 for (var i = 0; i < resetElements.length; i++) 1382 { 1383 RSFormProUtils.addEvent(resetElements[i], 'click', function() { 1384 if (typeof func === 'function') { 1385 window.setTimeout(func, 1); 1386 } 1387 }); 1388 } 1389 } 1390 1391 for (var field in thefields) { 1392 if (!thefields.hasOwnProperty(field)) { 1393 continue; 1394 } 1395 field = field.replace(formId+'_',''); 1396 objects = RSFormPro.getFieldsByName(formId,field); 1397 for(i = 0; i < objects.length;i++) { 1398 tagName = objects[i].tagName || objects[i].nodeName; 1399 1400 if (tagName === 'INPUT' || tagName === 'SELECT') { 1401 event = 'change'; 1402 if (tagName === 'INPUT' && typeof objects[i].type == 'string') { 1403 switch (objects[i].type.toUpperCase()) 1404 { 1405 default: 1406 event = 'change'; 1407 break; 1408 1409 case 'NUMBER': 1410 case 'TEXT': 1411 event = 'input'; 1412 1413 if (typeof RSFormPro.jQueryCalendar !== 'undefined' && 1414 typeof RSFormPro.jQueryCalendar.calendars[formId] !== 'undefined' && 1415 typeof RSFormPro.jQueryCalendar.calendars[formId][field] !== 'undefined') 1416 { 1417 RSFormPro.jQueryCalendar.calendars[formId][field].calendarInstance.setOptions({onChangeDateTime: function() { 1418 if (typeof func === 'function') { 1419 func(); 1420 } 1421 }}); 1422 } 1423 1424 if (typeof RSFormPro.YUICalendar !== 'undefined' && 1425 typeof RSFormPro.YUICalendar.calendars[formId] !== 'undefined' && 1426 typeof RSFormPro.YUICalendar.calendars[formId][field] !== 'undefined') 1427 { 1428 RSFormPro.YUICalendar.calendars[formId][field].selectEvent.subscribe(function() { 1429 if (typeof func === 'function') { 1430 func(); 1431 } 1432 }, RSFormPro.YUICalendar.calendars[formId][field], true); 1433 } 1434 1435 if (objects[i].hasOwnProperty('rsfpOnChange')) 1436 { 1437 objects[i].rsfpOnChange(func); 1438 } 1439 break; 1440 } 1441 } 1442
1443 RSFormProUtils.addEvent(objects[i], event, function() { 1444 if (typeof func === 'function') { 1445 func(); 1446 } 1447 }); 1448 } 1449 } 1450 } 1451 } 1452}; 1453 1454/* AJAX functions */ 1455RSFormPro.Ajax = { 1456 Wait: false, 1457 URL: false, 1458 Params: {}, 1459 getParamsObject: function() { 1460 return { 1461 vars: [], 1462 push: function(str) { 1463 return this.vars.push(str); 1464 }, 1465 1466 indexOf: function(str) { 1467 return this.vars.join('&').indexOf(str); 1468 }, 1469 1470 replace: function(r, w) { 1471 this.vars = this.vars.join('&').replace(r, w).split('&'); 1472 1473 return this.vars.join('&'); 1474 }, 1475 1476 toString: function() { 1477 return this.vars.join('&'); 1478 } 1479 }; 1480 }, 1481 getXHR: function() { 1482 try { 1483 return new window.XMLHttpRequest(); 1484 } catch ( e ) {} 1485 }, 1486 getXHRLegacy: function() { 1487 return { 1488 send: function(data) 1489 { 1490 if (data === RSFormPro.Ajax.Params) 1491 { 1492 data = data.toString(); 1493 } 1494 1495 return RSFormPro.Ajax.xhr.send(data); 1496 } 1497 } 1498 }, 1499 displayValidationErrors: function(formComponents, task, formId, data) { 1500 if (task == 'afterSend') { 1501 var ids, i, j, id, formComponent, elementBlock; 1502 var parentErrorClass = typeof data.parentErrorClass !== 'undefined' && data.parentErrorClass.length > 0 ? data.parentErrorClass : false; 1503 var fieldErrorClass = typeof data.fieldErrorClass !== 'undefined' && data.fieldErrorClass.length > 0 ? data.fieldErrorClass : false; 1504 1505 ids = data.response[0].split(','); 1506 for (i = 0; i < ids.length; i++) 1507 { 1508 id = parseInt(ids[i]); 1509 1510 if (isNaN(id)) 1511 { 1512 continue; 1513 } 1514 1515 if (typeof formComponents[id] === 'undefined') 1516 { 1517 continue; 1518 } 1519 1520 formComponent = RSFormPro.getFieldsByName(formId, formComponents[id]); 1521 1522 if (!formComponent || formComponent.length < 1) 1523 { 1524 continue; 1525 } 1526 1527 for (j = 0; j < formComponent.length; j++) 1528 { 1529 if (formComponent[j]) 1530 { 1531 RSFormProUtils.removeClass(formComponent[j], 'rsform-error'); 1532 formComponent[j].removeAttribute('aria-invalid'); 1533 if (formComponent[j].getAttribute('aria-describedby') === 'component' + id) { 1534 formComponent[j].removeAttribute('aria-describedby'); 1535 } 1536 1537 if (parentErrorClass) 1538 { 1539 try 1540 { 1541 if (elementBlock = RSFormPro.getBlock(formId, RSFormProUtils.getAlias(formComponents[id]))) 1542 { 1543 RSFormProUtils.removeClass(elementBlock[0], parentErrorClass); 1544 } 1545 } 1546 catch (err) {} 1547 } 1548 1549 if (fieldErrorClass) 1550 { 1551 RSFormProUtils.removeClass(formComponent[j], fieldErrorClass); 1552 } 1553 } 1554 } 1555 } 1556 1557 ids = data.response[1].split(','); 1558 var doFocus = false; 1559 for (i = 0; i < ids.length; i++) 1560 { 1561 id = parseInt(ids[i]); 1562 1563 if (isNaN(id)) 1564 { 1565 continue; 1566 } 1567 1568 if (typeof formComponents[id] === 'undefined') 1569 { 1570 continue; 1571 } 1572 1573 formComponent = RSFormPro.getFieldsByName(formId, formComponents[id]); 1574 1575 if (!formComponent || formComponent.length < 1) 1576 { 1577 continue; 1578 } 1579 1580 for (j = 0; j < formComponent.length; j++) 1581 { 1582 if (formComponent[j]) 1583 { 1584 RSFormProUtils.addClass(formComponent[j], 'rsform-error'); 1585 1586 if (parentErrorClass) 1587 { 1588 try 1589 { 1590 if (elementBlock = RSFormPro.getBlock(formId, RSFormProUtils.getAlias(formComponents[id]))) 1591 { 1592 RSFormProUtils.addClass(elementBlock[0], parentErrorClass); 1593 } 1594 } 1595 catch (err) {} 1596 } 1597 1598 if (fieldErrorClass) 1599 { 1600 RSFormProUtils.addClass(formComponent[j], fieldErrorClass); 1601 } 1602 1603 if (['INPUT', 'SELECT', 'TEXTAREA'].indexOf(formComponent[j].nodeName) > -1) 1604 { 1605 if (formComponent[j].getAttribute('type') !== 'button') { 1606 formComponent[j].setAttribute('aria-invalid', 'true'); 1607 formComponent[j].setAttribute('aria-describedby', 'component' + id); 1608 1609 if (!doFocus && typeof formComponent[j].focus === 'function') { 1610 formComponent[j].focus(); 1611 doFocus = true; 1612 } 1613 } 1614 } 1615 } 1616 } 1617 } 1618 1619 // scroll to first error elment 1620 if (RSFormPro.scrollToError){ 1621 RSFormPro.gotoErrorElement(formId); 1622 } 1623 } 1624 }, 1625 validate: function(form, page, errorClasses, totalPages) { 1626 try { 1627 var el = form.elements.length; 1628 } catch (err) { 1629 form = this; 1630 } 1631 1632 RSFormPro.Ajax.xhr = RSFormPro.Ajax.getXHR(); 1633 RSFormPro.Ajax.xmlHttp = RSFormPro.Ajax.getXHRLegacy(); 1634 var url = 'index.php?option=com_rsform&task=ajaxValidate'; 1635 if (typeof RSFormPro.Ajax.URL == 'string') { 1636 url = RSFormPro.Ajax.URL; 1637 } 1638 1639 RSFormPro.Ajax.Params = RSFormPro.Ajax.getParamsObject(); 1640 1641 var submits = [], 1642 errorFields = [], 1643 success = false, 1644 formId = form.elements['form[formId]'].value, 1645 totalJSDetectedPages = 0, 1646 i, 1647 j; 1648 1649 // File uploads AJAX validation variabiles 1650 var ajaxSkippedFileUploads = [], 1651 filesLength = 0, 1652 filesCollection = [], 1653 identicalFiles = []; 1654 1655 if (typeof errorClasses != 'object') 1656 { 1657 errorClasses = {'parent': '', 'field': ''} 1658 } 1659 1660 for (i=0; i<form.elements.length; i++) 1661 { 1662 // try and detect total pages of the form 1663 if (form.elements[i].type == 'button') { 1664 var onclick = form.elements[i].getAttribute('onclick'); 1665 if (typeof onclick === 'string' && (onclick.indexOf('rsfp_changePage') > -1 || onclick.indexOf('RSFormPro.Pages.change') > -1)) { 1666 var countCommas = 0; 1667 var pos = onclick.indexOf(','); 1668 while (pos > -1) { 1669 ++countCommas; 1670 pos = onclick.indexOf(',', ++pos); 1671 } 1672 1673 if (countCommas > 2) { 1674 totalJSDetectedPages++; 1675 } 1676 } 1677 } 1678 1679 // don't send an empty value 1680 if (!form.elements[i].name) continue; 1681 if (form.elements[i].name.length == 0) continue; 1682 // check if the checkbox is checked 1683 if (form.elements[i].type == 'checkbox' && form.elements[i].checked == false) continue; 1684 // check if the radio is selected 1685 if (form.elements[i].type == 'radio' && form.elements[i].checked == false) continue; 1686 1687 if (form.elements[i].type == 'submit' && form.elements[i].getAttribute('data-disableonsubmit') == '1') { 1688 submits.push(form.elements[i]); 1689 form.elements[i].disabled = true; 1690 } 1691 1692 // check if form is a dropdown with multiple selections 1693 if (form.elements[i].type == 'select-multiple') 1694 { 1695 for (j = 0; j < form.elements[i].options.length; j++) { 1696 if (form.elements[i].options[j].selected) { 1697 RSFormPro.Ajax.Params.push(form.elements[i].name + '=' + encodeURIComponent(form.elements[i].options[j].value)); 1698 } 1699 } 1700 1701 continue; 1702 } 1703 1704 if (form.elements[i].type == 'file') 1705 { 1706 if ('files' in form.elements[i]) 1707 { 1708 try 1709 { 1710 if (RSFormPro.usePositioning) 1711 { 1712 if (form.elements[i].offsetParent !== document.getElementsByTagName('body')[0]) 1713 { 1714 throw 'CONDITIONAL_HIDDEN'; 1715 } 1716 } 1717 else 1718 { 1719 if (form.elements[i].offsetParent === null) 1720 { 1721 throw 'CONDITIONAL_HIDDEN'; 1722 } 1723 } 1724 1725 if (form.elements[i].getAttribute('data-rsfp-skip-ajax') === 'true') 1726 { 1727 // Not already processed 1728 if (ajaxSkippedFileUploads.indexOf(form.elements[i].name) === -1) 1729 { 1730 // All fields are identical, make sure this code is only run once. 1731 ajaxSkippedFileUploads.push(form.elements[i].name); 1732 1733 // Get all identical fields 1734 identicalFiles = form.elements[form.elements[i].name]; 1735 1736 filesLength = 0; 1737 filesCollection = []; 1738 1739 if (typeof identicalFiles === 'object') 1740 { 1741 // NodeList (multiple inputs) 1742 if (typeof identicalFiles.length !== 'undefined' && identicalFiles.length > 0) 1743 { 1744 for (var tmp = 0; tmp < identicalFiles.length; tmp++) 1745 { 1746 if (identicalFiles[tmp].files.length > 0) 1747 { 1748 filesLength += identicalFiles[tmp].files.length; 1749 filesCollection = filesCollection.concat(identicalFiles[tmp].files[0]); 1750 } 1751 } 1752 } 1753 else if (typeof identicalFiles.files !== 'undefined') 1754 { 1755 // Just one input 1756 filesLength += identicalFiles.files.length; 1757 filesCollection = filesCollection.concat(identicalFiles.files[0]); 1758 } 1759 } 1760 } 1761 else 1762 { 1763 throw 'AJAX_SKIPPED_FILE_UPLOAD'; 1764 } 1765 } 1766 else 1767 { 1768 filesLength = form.elements[i].files.length; 1769 filesCollection = form.elements[i].files; 1770 } 1771 1772 if (filesLength === 0 && form.elements[i].getAttribute('data-rsfp-required') === 'true') 1773 { 1774 throw new RSFormPro.validationError('VALIDATION_ERROR', RSFormPro.Translations.translate(formId, form.elements[i].getAttribute('id'), 'VALIDATIONMESSAGE')); 1775 } 1776 1777 if (form.elements[i].getAttribute('data-rsfp-required') === 'true' || filesLength > 0) 1778 { 1779 if (form.elements[i].getAttribute('data-rsfp-minfiles')) 1780 { 1781 var minFiles = parseInt(form.elements[i].getAttribute('data-rsfp-minfiles')); 1782 1783 if (filesLength < minFiles) 1784 { 1785 throw new RSFormPro.validationError('VALIDATION_ERROR', RSFormProUtils.sprintf(RSFormPro.Translations.commonTranslate('COM_RSFORM_MIN
1785FILES_REQUIRED'), minFiles)); 1786 } 1787 } 1788 1789 if (form.elements[i].getAttribute('data-rsfp-maxfiles')) 1790 { 1791 var maxFiles = parseInt(form.elements[i].getAttribute('data-rsfp-maxfiles')); 1792 1793 if (filesLength > maxFiles) 1794 { 1795 throw new RSFormPro.validationError('VALIDATION_ERROR', RSFormProUtils.sprintf(RSFormPro.Translations.commonTranslate('COM_RSFORM_MAXFILES_REQUIRED'), maxFiles)); 1796 } 1797 } 1798 } 1799 1800 for (var f = 0; f < filesLength; f++) 1801 { 1802 var file = filesCollection[f]; 1803 var maxSize = parseInt(form.elements[i].getAttribute('data-rsfp-size')); 1804 if ('size' in file && maxSize > 0) 1805 { 1806 if (file.size > maxSize) 1807 { 1808 throw new RSFormPro.validationError('VALIDATION_ERROR', RSFormProUtils.sprintf(RSFormPro.Translations.commonTranslate('COM_RSFORM_FILE_EXCEEDS_LIMIT'), file.name, maxSize / 1024)); 1809 } 1810 } 1811 if ('name' in file) 1812 { 1813 var exts = form.elements[i].getAttribute('data-rsfp-exts'); 1814 if (exts) 1815 { 1816 exts = JSON.parse(exts); 1817 1818 var ext = file.name.slice((file.name.lastIndexOf(".") - 1 >>> 0) + 2); 1819 if (exts.indexOf(ext.toLowerCase()) === -1) 1820 { 1821 throw new RSFormPro.validationError('VALIDATION_ERROR', RSFormProUtils.sprintf(RSFormPro.Translations.commonTranslate('COM_RSFORM_FILE_EXTENSION_NOT_ALLOWED'), file.name)); 1822 } 1823 } 1824 } 1825 } 1826 } 1827 catch (error) 1828 { 1829 if (typeof error === 'object') 1830 { 1831 if (error.toString() === 'VALIDATION_ERROR') 1832 { 1833 var parents = RSFormProUtils.getParents(form.elements[i]), 1834 page_number, 1835 parent; 1836 if (parents.length > 0) 1837 { 1838 for (var p = 0; p < parents.length; p++) 1839 { 1840 parent = parents[p]; 1841 1842 if ('getAttribute' in parent) 1843 { 1844 var hasId = parents[p].getAttribute('id'); 1845 var pageId = 'rsform_' + formId + '_page_'; 1846 if (hasId && hasId.indexOf(pageId) === 0) 1847 { 1848 page_number = hasId.slice(pageId.length); 1849 break; 1850 } 1851 } 1852 } 1853 } 1854 1855 var elementObj = { 1856 field: form.elements[i], 1857 page: page_number 1858 }; 1859 1860 // try to get the componentId 1861 var componentId = RSFormPro.HTML5.getComponentId(formId, form.elements[i].getAttribute('id')); 1862 if (componentId) 1863 { 1864 elementObj.componentId = componentId; 1865 1866 if (document.getElementById('component' + componentId) && error.message.length > 0) 1867 { 1868 document.getElementById('component' + componentId).innerText = error.message; 1869 } 1870 } 1871 1872 errorFields.push(elementObj); 1873 } 1874 } 1875 } 1876 } 1877 } 1878 1879 if (form.elements[i].type !== 'file') 1880 { 1881 if (typeof RSFormPro.Editors[form.elements[i].name] === 'function' && RSFormPro.Editors[form.elements[i].name]() !== null) 1882 { 1883 RSFormPro.Ajax.Params.push(form.elements[i].name + '=' + encodeURIComponent(RSFormPro.Editors[form.elements[i].name]())); 1884 } 1885 else 1886 { 1887 RSFormPro.Ajax.Params.push(form.elements[i].name + '=' + encodeURIComponent(form.elements[i].value)); 1888 } 1889 } 1890 } 1891 1892 errorFields = errorFields.concat(RSFormPro.HTML5.validation(formId)); 1893 1894 if (page) { 1895 RSFormPro.Ajax.Params.push('page=' + page); 1896 } 1897 1898 RSFormPro.Ajax.xhr.open("POST", url, true); 1899 1900 //Send the proper header information along with the request 1901 RSFormPro.Ajax.xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 1902 1903 if (typeof ajaxExtraValidationScript[formId] == 'function') { 1904 ajaxExtraValidationScript[formId]('beforeSend', formId, {'url': url, 'params': RSFormPro.Ajax.Params}); 1905 } 1906 1907 if (!RSFormPro.Ajax.Wait) 1908 { 1909 // B/C layer 1910 RSFormPro.Ajax.xmlHttp.send(RSFormPro.Ajax.Params); 1911 } 1912 success = true; 1913 1914 RSFormPro.Ajax.xhr.onreadystatechange = function() { 1915 if (RSFormPro.Ajax.xhr.readyState === 4 && RSFormPro.Ajax.xhr.status === 200) { 1916 try 1917 { 1918 var RSFormProResponse = JSON.parse(RSFormPro.Ajax.xhr.responseText); 1919 } 1920 catch (error) 1921 { 1922 // Parse invalid data 1923 if (typeof RSFormProResponse !== 'object') 1924 { 1925 var match = RSFormPro.Ajax.xhr.responseText.match(/{.*}/); 1926 1927 if (match.length > 0) 1928 { 1929 RSFormProResponse = JSON.parse(match[0]); 1930 } 1931 } 1932 } 1933 1934 var response = []; 1935 var ids; 1936 var i; 1937 1938 if (typeof RSFormProResponse.formComponents !== 'undefined') 1939 { 1940 // All spans set to no error 1941 ids = RSFormProResponse.formComponents; 1942 1943 for (i = 0; i < ids.length; i++) 1944 { 1945 if (!isNaN(parseInt(ids[i])) && document.getElementById('component'+ids[i])) 1946 { 1947 document.getElementById('component'+ids[i]).className = 'formNoError'; 1948 } 1949 } 1950 1951 // Legacy 1952 response.push(RSFormProResponse.formComponents.join(',')); 1953 } 1954 1955 if (typeof RSFormProResponse.invalidComponents === 'undefined') 1956 {
1957 RSFormProResponse.invalidComponents = []; 1958 } 1959 1960 // add the HTML5 elements with errors 1961 var errorOnPage; 1962 if (errorFields.length) 1963 { 1964 for (i = 0; i < errorFields.length; i++) 1965 { 1966 if (typeof errorFields[i].componentId !== 'undefined') 1967 { 1968 if (typeof page === 'undefined' || (page - 1) == errorFields[i].page) 1969 { 1970 RSFormProResponse.invalidComponents.push(errorFields[i].componentId); 1971 if (typeof errorOnPage !== 'undefined') 1972 { 1973 errorOnPage = errorFields[i].page < errorOnPage ? errorFields[i].page : errorOnPage; 1974 } 1975 else 1976 { 1977 errorOnPage = errorFields[i].page; 1978 } 1979 } 1980 } 1981 } 1982 } 1983 1984 // Show errors 1985 var errorComponents = []; 1986 1987 var errorMessageContainer; 1988 1989 for (i = 0; i < RSFormProResponse.invalidComponents.length; i++) 1990 { 1991 if (!isNaN(parseInt(RSFormProResponse.invalidComponents[i]))) 1992 { 1993 errorMessageContainer = document.getElementById('component' + RSFormProResponse.invalidComponents[i]); 1994 1995 if (errorMessageContainer) 1996 { 1997 errorMessageContainer.className = 'formError'; 1998 1999 if (RSFormProResponse.validationMessages && typeof RSFormProResponse.validationMessages[RSFormProResponse.invalidComponents[i]] !== 'undefined') 2000 { 2001 errorMessageContainer.innerHTML = RSFormProResponse.validationMessages[RSFormProResponse.invalidComponents[i]]; 2002 } 2003 } 2004 2005 errorComponents.push(RSFormProResponse.invalidComponents[i]); 2006 success = false; 2007 } 2008 } 2009 2010 // lets detect if the multiple page form is submitted 2011 var changePageHTML5Errors = false; 2012 if (totalJSDetectedPages > 0 && RSClickedSubmitElement && submits.indexOf(RSClickedSubmitElement) >= 0 && typeof errorOnPage !== 'undefined') { 2013 changePageHTML5Errors = true; 2014 } 2015 2016 // Legacy 2017 response.push(RSFormProResponse.invalidComponents.join(',')); 2018 2019 if (typeof RSFormProResponse.allPages !== 'undefined' || changePageHTML5Errors) 2020 { 2021 // Legacy 2022 response.push(RSFormProResponse.currentPage); 2023 response.push(RSFormProResponse.allPages); 2024 2025 if (typeof RSFormProResponse.allPages !== 'undefined') 2026 { 2027 page = parseInt(RSFormProResponse.currentPage) - 1; 2028 totalPages = parseInt(RSFormProResponse.allPages); 2029 if (changePageHTML5Errors) 2030 { 2031 page = page > errorOnPage ? errorOnPage : page; 2032 } 2033 } 2034 else 2035 { 2036 if (changePageHTML5Errors) 2037 { 2038 page = errorOnPage; 2039 totalPages = totalJSDetectedPages; 2040 } 2041 } 2042
2043 RSFormPro.Pages.change(formId, page, totalPages, false); 2044 } 2045 2046 if (typeof ajaxExtraValidationScript[formId] === 'function') 2047 { 2048 // rewrite the response so that all the error components are added (that includes HTML5 fields) 2049 if (errorComponents.length) 2050 { 2051 response[1] = errorComponents.join(); 2052 } 2053 2054 ajaxExtraValidationScript[formId]('afterSend', formId, {'url': url, 'params': RSFormPro.Ajax.Params, 'response': response, 'parentErrorClass': errorClasses.parent, 'fieldErrorClass': errorClasses.field, 'json': RSFormProResponse}); 2055 } 2056 2057 if (success === false) 2058 { 2059 // The submits must be clickable again 2060 for (i = 0; i < submits.length; i++) 2061 { 2062 submits[i].disabled = false; 2063 } 2064 2065 try 2066 { 2067 if (typeof page === 'undefined' || page == 0) 2068 { 2069 RSFormPro.callbacks.runCallback(formId, 'afterValidationFailed'); // callback functions if validation fails when form is submitted 2070 } 2071 else 2072 { 2073 RSFormPro.callbacks.runCallback(formId, 'nextPageFailed'); // callback functions if validation fails when a specific page of the form is checked 2074 } 2075 2076 if (document.getElementById('rsform_error_' + formId)) 2077 { 2078 document.getElementById('rsform_error_' + formId).style.display = 'block'; 2079 } 2080 } 2081 catch (err) { } 2082 } 2083 else 2084 { 2085 // Change the page if the validation passes 2086 if (page) 2087 { 2088 RSFormPro.Pages.change(formId, page, totalPages, false); 2089 // The submits must be clickable again 2090 for (i = 0; i < submits.length; i++) 2091 { 2092 submits[i].disabled = false; 2093 } 2094 } 2095 else 2096 { 2097 // the submit button has been pressed so we need to submit the form 2098 // if the submit button or any other element has the id submit the form.submit() function is overwritten 2099 RSFormPro.submitForm(form); 2100 } 2101 2102 try 2103 { 2104 if (typeof page === 'undefined' || page == 0) 2105 { 2106 RSFormPro.callbacks.runCallback(formId, 'afterValidationSuccess'); // callback functions if validation succeeds 2107 } 2108 else 2109 { 2110 RSFormPro.callbacks.runCallback(formId, 'nextPageSuccess'); // callback functions if validation succeeds when a specific page of the form is checked 2111 } 2112 2113 if (document.getElementById('rsform_error_' + formId)) 2114 { 2115 document.getElementById('rsform_error_' + formId).style.display = 'none'; 2116 } 2117 } 2118 catch (err) { } 2119 } 2120 2121 return success; 2122 } 2123 }; 2124 2125 return false; 2126 }, 2127 overrideSubmit: function(formId, validationParams, disableSubmitButton) { 2128 var form = RSFormPro.getForm(formId); 2129 var submitElement = RSFormPro.getElementByType(formId, 'submit'); 2130 var i, j; 2131 for (i = 0; i < submitElement.length; i++) { 2132 if (RSFormProUtils.hasClass(submitElement[i],'rsform-submit-button')) { 2133 RSFormProUtils.addEvent(submitElement[i],'click', (function(event) { 2134 event.preventDefault(); 2135 RSClickedSubmitElement = this; 2136 if (disableSubmitButton) { 2137 for (j = 0; j < submitElement.length; j++) { 2138 submitElement[j].setAttribute('data-disableonsubmit','1'); 2139 } 2140 } 2141
2142 RSFormPro.Ajax.validate(form, undefined, validationParams); 2143 })); 2144 } 2145 } 2146 } 2147}; 2148 2149RSFormPro.validationError = function(type, message) { 2150 this.type = type; 2151 this.message = message; 2152}; 2153 2154RSFormPro.validationError.prototype.toString = function() { 2155 return this.type; 2156}; 2157 2158RSFormPro.callbacks = { 2159 allCallbacks: {}, 2160 2161 addCallback: function(formId, callbackName, args) { 2162 var base = RSFormPro.callbacks; 2163 2164 if (typeof base.allCallbacks[formId] == 'undefined') { 2165 base.allCallbacks[formId] = {} 2166 } 2167 2168 if (typeof base.allCallbacks[formId][callbackName] == 'undefined') { 2169 base.allCallbacks[formId][callbackName] = []; 2170 } 2171 2172 base.allCallbacks[formId][callbackName].push(args); 2173 }, 2174 2175 runCallback: function(formId, callbackName) { 2176 var base = RSFormPro.callbacks; 2177 if (typeof base.allCallbacks[formId] != 'undefined' && typeof base.allCallbacks[formId][callbackName] != 'undefined' && base.allCallbacks[formId][callbackName].length > 0) { 2178 for (var i = 0; i < base.allCallbacks[formId][callbackName].length; i++) { 2179 var args = base.allCallbacks[formId][callbackName][i]; 2180 var functionName = args[0]; 2181 2182 var functionArgs = []; 2183 for (var j = 1; j < args.length; j++) { 2184 functionArgs.push(args[j]); 2185 } 2186 2187 // execute the callback function set for this trigger 2188 functionName.apply(self, functionArgs); 2189 } 2190 } 2191 } 2192}; 2193 2194/* Translations */ 2195 2196RSFormPro.Translations = { 2197 translations: {}, 2198 commonTranslations: {}, 2199 2200 add: function(formId, name, key, translation) { 2201 if (typeof this.translations[formId + '-' + name] !== 'object') 2202 { 2203 this.translations[formId + '-' + name] = {}; 2204 } 2205 2206 this.translations[formId + '-' + name][key] = translation; 2207 }, 2208 2209 translate: function(formId, name, key) { 2210 if (typeof this.translations[formId + '-' + name][key] == 'string') 2211 { 2212 return this.translations[formId + '-' + name][key]; 2213 } 2214 2215 return key; 2216 }, 2217 2218 addCommonTranslation: function(key, translation) { 2219 this.commonTranslations[key] = translation; 2220 }, 2221 2222 addCommonTranslations: function(translations) { 2223 var self = this; 2224 translations.forEach(function(el){ 2225 self.commonTranslations[el[0]] = el[1]; 2226 }) 2227 }, 2228 2229 commonTranslate: function(key) { 2230 if (typeof this.commonTranslations[key] == 'string') 2231 { 2232 return this.commonTranslations[key]; 2233 } 2234 2235 return key; 2236 } 2237}; 2238 2239RSFormPro.previewFields = { 2240 'elements': [], 2241 'delimiter': ', ', 2242 escapeValue: function(str) { 2243 var textAreaDiv = document.createElement('textarea'); 2244 textAreaDiv.textContent = str; 2245 return textAreaDiv.innerHTML; 2246 }, 2247 attachEvents: function() { 2248 if (RSFormPro.previewFields.elements.length > 0) { 2249 var element, results, i, j, tagName; 2250 var form; 2251 for (i = 0; i < RSFormPro.previewFields.elements.length; i++) { 2252 element = RSFormPro.previewFields.elements[i]; 2253 results = RSFormPro.getFieldsByName(element.formId, element.fieldName); 2254 form = RSFormPro.getForm(element.formId) 2255 2256 if (results.length > 0) { 2257 for (j = 0; j < results.length; j++) { 2258 (function(element, field, formId, form){ 2259 var funcValue = function () { 2260 if (document.getElementById('preview-' + element.previewId)) { 2261 if (field.hasOwnProperty('rsfpGetPreviewValue')) { 2262 document.getElementById('preview-' + element.previewId).innerHTML = field.rsfpGetPreviewValue(); 2263 } else { 2264 document.getElementById('preview-' + element.previewId).innerText = field.value; 2265 } 2266 } 2267 } 2268 var funcMultiple = function () { 2269 if (document.getElementById('preview-' + element.previewId)) { 2270 var theValue = []; 2271 if (form.elements[field.name]) { 2272 if (form.elements[field.name].forEach) { 2273 form.elements[field.name].forEach(function (el) { 2274 if (el.checked) { 2275 if (document.querySelector('[for="' + el.id + '"]')) { 2276 theValue.push(RSFormPro.previewFields.escapeValue(document.querySelector('[for="' + el.id + '"]').innerText)); 2277 } else { 2278 if (el.hasOwnProperty('rsfpGetPreviewValue')) { 2279 theValue.push(RSFormPro.previewFields.escapeValue(el.rsfpGetPreviewValue())); 2280 } else { 2281 theValue.push(RSFormPro.previewFields.escapeValue(el.value)); 2282 } 2283 } 2284 } 2285 }) 2286 } else { 2287 if (form.elements[field.name].checked) { 2288 if (form.elements[field.name].hasOwnProperty('rsfpGetPreviewValue')) { 2289 theValue.push(RSFormPro.previewFields.escapeValue(form.elements[field.name].rsfpGetPreviewValue())); 2290 } else { 2291 theValue.push(RSFormPro.previewFields.escapeValue(form.elements[field.name].value)); 2292 } 2293 } 2294 } 2295 } 2296 document.getElementById('preview-' + element.previewId).innerHTML = theValue.join(element.separator || RSF
2296ormPro.previewFields.delimiter); 2297 } 2298 } 2299 var funcSurveyTable = function() { 2300 if (document.getElementById('preview-' + element.previewId)) { 2301 var theValue = []; 2302 var theQuestions = []; 2303 var theAnswers = []; 2304 var questions = parseInt(field.getAttribute('data-rsfpsurveytable-questions')); 2305 if (!isNaN(questions)) { 2306 var match = field.name.match(/^form\[(.*)]\[[0-9]+]$/); 2307 if (match) 2308 { 2309 var name = match[1]; 2310 var firstPart = 'form[' + name + ']'; 2311 for (var i = 0; i < questions; i ++) { 2312 if (form.elements[firstPart + '[' + i + ']']) 2313 { 2314 if (form.elements[firstPart + '[' + i + ']'].forEach) 2315 { 2316 form.elements[firstPart + '[' + i + ']'].forEach(function(el){ 2317 if (el.checked) 2318 { 2319 theAnswers.push(el.parentNode.getAttribute('data-th')); 2320 2321 if (document.getElementById(el.getAttribute('aria-labelledby'))) 2322 { 2323 theQuestions.push(document.getElementById(el.getAttribute('aria-labelledby')).innerText); 2324 } 2325 else 2326 { 2327 theQuestions.push(el.parentNode.parentNode.firstChild.innerText); 2328 } 2329 } 2330 }); 2331 } 2332 else 2333 { 2334 if (form.elements[firstPart + '[' + i + ']'].checked) 2335 { 2336 theAnswers.push(form.elements[firstPart + '[' + i + ']'].parentNode.getAttribute('data-th')); 2337 2338 if (document.getElementById(form.elements[firstPart + '[' + i + ']'].getAttribute('aria-labelledby'))) 2339 { 2340 theQuestions.push(document.getElementById(form.elements[firstPart + '[' + i + ']'].getAttribute('aria-labelledby')).innerText); 2341 } 2342 else 2343 { 2344 theQuestions.push(form.elements[firstPart + '[' + i + ']'].parentNode.parentNode.firstChild.innerText); 2345 } 2346 } 2347 } 2348 } 2349 } 2350 2351 for (var j = 0; j < theAnswers.length; j++) { 2352 theValue.push(element.template.replace('{question}', theQuestions[j]).replace('{answer}', theAnswers[j])); 2353 } 2354 } 2355 } 2356 2357 document.getElementById('preview-' + element.previewId).innerHTML = theValue.join(element.separator || RSF
2357ormPro.previewFields.delimiter); 2358 } 2359 } 2360 var funcSelect = function () { 2361 if (document.getElementById('preview-' + element.previewId)) { 2362 var theValue = []; 2363 if (field.options.length > 0) { 2364 for (var i = 0; i < field.options.length; i++) { 2365 if (field.options[i].selected) { 2366 theValue.push(RSFormPro.previewFields.escapeValue(field.options[i].text)); 2367 } 2368 } 2369 } 2370 document.getElementById('preview-' + element.previewId).innerHTML = theValue.join(element.separator || RSFormPro.previewFields.delimiter); 2371 } 2372 } 2373 var funcBirthday = function () { 2374 if (document.getElementById('preview-' + element.previewId)) { 2375 var theValue = []; 2376 var theRoot = field.name.replace(/\[[dmy]]$/, ''); 2377 var theElements = [theRoot + '[d]', theRoot + '[m]', theRoot + '[y]']; 2378 theElements.forEach(function(el){ 2379 if (form.elements[el] && form.elements[el].value !== '') { 2380 theValue.push(form.elements[el].options[form.elements[el].selectedIndex].text); 2381 } 2382 }) 2383 document.getElementById('preview-' + element.previewId).innerHTML = theValue.join(element.separator || '-'); 2384 } 2385 } 2386 var funcFiles = function () { 2387 if (document.getElementById('preview-' + element.previewId)) { 2388 var f; 2389 var theValue = []; 2390 if (form.elements[field.name]) { 2391 if (form.elements[field.name].forEach) { 2392 form.elements[field.name].forEach(function (el) { 2393 if (el.files && el.files.length > 0) { 2394 for (f = 0; f < el.files.length; f++) { 2395 theValue.push(RSFormPro.previewFields.escapeValue(el.files[f].name)); 2396 } 2397 } 2398 }) 2399 } else { 2400 if (form.elements[field.name].files && form.elements[field.name].files.length > 0) { 2401 for (f = 0; f < form.elements[field.name].files.length; f++) { 2402 theValue.push(RSFormPro.previewFields.escapeValue(form.elements[field.name].files[f].name)); 2403 } 2404 } 2405 } 2406 } 2407 document.getElementById('preview-' + element.previewId).innerHTML = theValue.join(element.separator || RSF
2407ormPro.previewFields.delimiter); 2408 } 2409 } 2410 tagName = field.tagName || field.nodeName; 2411 2412 if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') { 2413 var attachEvent = 'change'; 2414 if (tagName === 'INPUT' && typeof field.type == 'string') { 2415 switch (field.type.toUpperCase()) { 2416 case 'FILE': 2417 funcValue = funcFiles; 2418 break; 2419 2420 case 'CHECKBOX': 2421 case 'RADIO': 2422 if (field.getAttribute('data-rsfpsurveytable-answer')) 2423 { 2424 funcValue = funcSurveyTable; 2425 } 2426 else 2427 { 2428 funcValue = funcMultiple; 2429 } 2430 2431 break; 2432 2433 case 'NUMBER': 2434 case 'TEXT': 2435 case 'PASSWORD': 2436 case 'EMAIL': 2437 case 'TEL': 2438 case 'URL': 2439 case 'RANGE': 2440 attachEvent = 'input'; 2441 if (typeof RSFormPro.jQueryCalendar !== 'undefined' && 2442 typeof RSFormPro.jQueryCalendar.calendars[formId] !== 'undefined' && 2443 typeof RSFormPro.jQueryCalendar.calendars[formId][element.fieldName] !== 'undefined') { 2444 RSFormPro.jQueryCalendar.calendars[formId][element.fieldName].calendarInstance.setOptions({ 2445 onChangeDateTime: function () { 2446 if (typeof funcValue === 'function') { 2447 funcValue(); 2448 } 2449 } 2450 }); 2451 } 2452 2453 if (typeof RSFormPro.YUICalendar !== 'undefined' && 2454 typeof RSFormPro.YUICalendar.calendars[formId] !== 'undefined' && 2455 typeof RSFormPro.YUICalendar.calendars[formId][element.fieldName] !== 'undefined') { 2456 RSFormPro.YUICalendar.calendars[formId][element.fieldName].selectEvent.subscribe(function () { 2457 if (typeof funcValue === 'function') { 2458 funcValue(); 2459 } 2460 }, RSFormPro.YUICalendar.calendars[formId][element.fieldName], true); 2461 } 2462 2463 if (field.hasOwnProperty('rsfpOnChange')) { 2464 field.rsfpOnChange(funcValue); 2465 } 2466 break; 2467 } 2468 } else if (tagName === 'SELECT' && field.multiple === false && field.name.match(/form\[.*?]\[[dmy]]/)) { 2469 funcValue = funcBirthday; 2470 } else if (tagName === 'SELECT') { 2471 funcValue = funcSelect; 2472 } else if (tagName === 'TEXTAREA') { 2473 attachEvent = 'input'; 2474 } 2475 2476 RSFormProUtils.addEvent(field, attachEvent, function () { 2477 if (typeof funcValue === 'function') { 2478 funcValue(); 2479 } 2480 });
2481 2482 funcValue(); 2483 } 2484 })(element, results[j], element.formId, form); 2485 } 2486 } 2487 } 2488 } 2489 } 2490}; 2491 2492/* Helper functions */ 2493var RSFormProUtils = { 2494 addEvent: function(obj, evType, fn) { 2495 if (obj.addEventListener) 2496 { 2497 obj.addEventListener(evType, fn, false); 2498 return true; 2499 } 2500 else if (obj.attachEvent) 2501 { 2502 var r = obj.attachEvent("on"+evType, fn); 2503 return r; 2504 } 2505 else 2506 { 2507 return false; 2508 } 2509 }, 2510 hasClass: function (el, name) { 2511 return new RegExp('(\\s|^)' + name + '(\\s|$)').test(el.className); 2512 }, 2513 addClass: function(el, name) { 2514 if (!RSFormProUtils.hasClass(el, name)) { 2515 el.className += (el.className ? ' ' : '') + name; 2516 } 2517 }, 2518 removeClass: function(el, name) { 2519 if (RSFormProUtils.hasClass(el, name)) { 2520 el.className = el.className.replace(new RegExp('(\\s|^)' + name + '(\\s|$)'),' ').replace(/^\s+|\s+$/g, ''); 2521 } 2522 }, 2523 setDisplay: function (items, value) { 2524 if (!items || !items.length) { 2525 return false; 2526 } 2527 2528 for (var i = 0; i < items.length; i++) { 2529 if (!items[i]) { 2530 continue; 2531 } 2532 2533 if (!RSFormPro.usePositioning) { 2534 items[i].style.display = value; 2535 } else { 2536 value === 'none' ? RSFormProUtils.addClass(items[i], 'formHidden') : RSFormProUtils.removeClass(items[i], 'formHidden'); 2537 } 2538 } 2539 }, 2540 setAttr: function (items, attr, value) { 2541 for (var i = 0; i < items.length; i++) { 2542 items[i].setAttribute(attr, value); 2543 } 2544 }, 2545 remAttr: function (items, attr) { 2546 for (var i = 0; i < items.length; i++) { 2547 items[i].removeAttribute(attr); 2548 } 2549 }, 2550 getChecked: function (items) { 2551 var elements = []; 2552 var element, tagName; 2553 for (var i = 0; i < items.length; i++) { 2554 element = items[i]; 2555 tagName = element.tagName || element.nodeName; 2556 2557 if (tagName == 'INPUT' && element.type && element.type.toUpperCase() == 'CHECKBOX' && element.checked == true) { 2558 elements.push(element); 2559 } 2560 } 2561 2562 return elements; 2563 }, 2564 getUnchecked: function (items) { 2565 var elements = []; 2566 var element, tagName; 2567 for (var i = 0; i < items.length; i++) { 2568 element = items[i]; 2569 tagName = element.tagName || element.nodeName; 2570 2571 if (tagName == 'INPUT' && element.type && element.type.toUpperCase() == 'CHECKBOX' && !element.checked) { 2572 elements.push(element); 2573 } 2574 } 2575 2576 return elements; 2577 }, 2578 getAlias: function(str) { 2579 str = str.replace(/\-/g, ' '); 2580 2581 if (!String.prototype.trim) { 2582 str = str.replace(/^\s+|\s+$/g, ''); 2583 } else { 2584 str = str.trim(); 2585 } 2586 2587 str = str.toLowerCase(); 2588 str = str.replace(/(\s|[^A-Za-z0-9\-])+/g, '-'); 2589 str = str.replace(/^\-+|\-+$/g, ''); 2590 2591 return str; 2592 }, 2593 getParents: function(a) { 2594 var els = []; 2595 while (a) { 2596 els.push(a); 2597 a = a.parentNode; 2598 } 2599 // Remove our own element 2600 if (els.length > 0) 2601 { 2602 els.shift() 2603 } 2604 2605 return els; 2606 }, 2607 getElementsByClassName: function (className, tag, elm) { 2608 if (document.getElementsByClassName) { 2609 getElementsByClassName = function (className, tag, elm) { 2610 elm = elm || document; 2611 var elements = elm.getElementsByClassName(className), 2612 nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null, 2613 returnElements = [], 2614 current; 2615 for(var i=0, il=elements.length; i<il; i+=1){ 2616 current = elements[i]; 2617 if(!nodeName || nodeName.test(current.nodeName)) { 2618 returnElements.push(current); 2619 } 2620 } 2621 return returnElements; 2622 }; 2623 } else if (document.evaluate) { 2624 getElementsByClassName = function (className, tag, elm) { 2625 tag = tag || "*"; 2626 elm = elm || document; 2627 var classes = className.split(" "), 2628 classesToCheck = "", 2629 xhtmlNamespace = "http://www.w3.org/1999/xhtml", 2630 namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null, 2631 returnElements = [], 2632 elements, 2633 node; 2634 for(var j=0, jl=classes.length; j<jl; j+=1){ 2635 classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]"; 2636 }
2637 try { 2638 elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null); 2639 } 2640 catch (e) { 2641 elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null); 2642 } 2643 while ((node = elements.iterateNext())) { 2644 returnElements.push(node); 2645 } 2646 return returnElements; 2647 }; 2648 } else { 2649 getElementsByClassName = function (className, tag, elm) { 2650 tag = tag || "*"; 2651 elm = elm || document; 2652 var classes = className.split(" "), 2653 classesToCheck = [], 2654 elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag), 2655 current, 2656 returnElements = [], 2657 match; 2658 for(var k=0, kl=classes.length; k<kl; k+=1){ 2659 classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)")); 2660 } 2661 for(var l=0, ll=elements.length; l<ll; l+=1){ 2662 current = elements[l]; 2663 match = false; 2664 for(var m=0, ml=classesToCheck.length; m<ml; m+=1){ 2665 match = classesToCheck[m].test(current.className); 2666 if (!match) { 2667 break; 2668 } 2669 } 2670 if (match) { 2671 returnElements.push(current); 2672 } 2673 } 2674 return returnElements; 2675 }; 2676 } 2677 2678 return getElementsByClassName(className, tag, elm); 2679 }, 2680 2681 /*! 2682 ** sprintf.js -- POSIX sprintf(3)-style String Formatting for JavaScript 2683 ** Copyright (c) 2006-2019 Dr. Ralf S. Engelschall <[email protected]> 2684 ** Partly based on Public Domain code by Jan Moesen <http://jan.moesen.nu/> 2685 ** 2686 ** Permission is hereby granted, free of charge, to any person obtaining 2687 ** a copy of this software and associated documentation files (the 2688 ** "Software"), to deal in the Software without restriction, including 2689 ** without limitation the rights to use, copy, modify, merge, publish, 2690 ** distribute, sublicense, and/or sell copies of the Software, and to 2691 ** permit persons to whom the Software is furnished to do so, subject to 2692 ** the following conditions: 2693 ** 2694 ** The above copyright notice and this permission notice shall be included 2695 ** in all copies or substantial portions of the Software. 2696 ** 2697 ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 2698 ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2699 ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 2700 ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 2701 ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2702 ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2703 ** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2704 */ 2705 sprintf: function () { 2706 /* argument sanity checking */ 2707 if (!arguments || arguments.length < 1) 2708 throw new Error("sprintf: ERROR: not enough arguments"); 2709 2710 /* initialize processing queue */ 2711 var argumentnum = 0; 2712 var done = "", todo = arguments[argumentnum++]; 2713 2714 /* parse still to be done format string */ 2715 var m; 2716 while ((m = /^([^%]*)%(?:(\d+)\$|\((.*?)\))?([#0 +'-]+)?(\*|\d+)?(\.\*|\.\d+)?([%diouxXfFeEcs])((?:.|[\r\n])*)$/.exec(todo))) { 2717 var pProlog = m[1], 2718 pAccessD = m[2], 2719 pAccessN = m[3], 2720 pFlags = m[4], 2721 pMinLength = m[5], 2722 pPrecision = m[6], 2723 pType = m[7], 2724 pEpilog = m[8]; 2725 2726 /* determine substitution */ 2727 var subst; 2728 if (pType === "%") 2729 /* special case: escaped percent character */ 2730 subst = "%"; 2731 else { 2732 /* parse padding and justify aspects of flags */ 2733 var padWith = " "; 2734 var justifyRight = true; 2735 if (pFlags) { 2736 if (pFlags.indexOf("0") >= 0) 2737 padWith = "0"; 2738 if (pFlags.indexOf("-") >= 0) { 2739 padWith = " "; 2740 justifyRight = false; 2741 } 2742 } 2743 else 2744 pFlags = ""; 2745 2746 /* determine minimum length */ 2747 var access; 2748 var minLength = -1; 2749 if (pMinLength) { 2750 if (pMinLength === "*") { 2751 access = argumentnum++; 2752 if (access >= arguments.length) 2753 throw new Error("sprintf: ERROR: not enough arguments"); 2754 minLength = arguments[access]; 2755 } 2756 else 2757 minLength = parseInt(pMinLength, 10); 2758 } 2759 2760 /* determine precision */ 2761 var precision = -1; 2762 if (pPrecision) { 2763 if (pPrecision === ".*") { 2764 access = argumentnum++; 2765 if (access >= arguments.length) 2766 throw new Error("sprintf: ERROR: not enough arguments"); 2767 precision = arguments[access]; 2768 } 2769 else 2770 precision = parseInt(pPrecision.substring(1), 10); 2771 } 2772 2773 /* determine how to fetch argument */ 2774 access = argumentnum++; 2775 if (pAccessD) { 2776 access = parseInt(pAccessD, 10); 2777 if (access >= arguments.length) 2778 throw new Error("sprintf: ERROR: not enough arguments"); 2779 subst = arguments[access]; 2780 } 2781 else if (pAccessN) { 2782 if (typeof arguments[1] !== "object")
2783 throw new Error("sprintf: ERROR: invalid non-object arguments for named argument"); 2784 subst = arguments[1][pAccessN]; 2785 if (typeof subst === "undefined") 2786 throw new Error("sprintf: ERROR: invalid undefined value for named argument"); 2787 } 2788 else { 2789 if (access >= arguments.length) 2790 throw new Error("sprintf: ERROR: not enough arguments"); 2791 subst = arguments[access]; 2792 } 2793 2794 /* dispatch into expansions according to type */ 2795 var prefix = ""; 2796 switch (pType) { 2797 /* decimal number */ 2798 case "d": 2799 case "i": 2800 if (typeof subst !== "number") 2801 subst = 0; 2802 subst = subst.toString(10); 2803 if (pFlags.indexOf("#") >= 0 && subst >= 0) 2804 subst = "+" + subst; 2805 if (pFlags.indexOf(" ") >= 0 && subst >= 0) 2806 subst = " " + subst; 2807 break; 2808 2809 /* binary number */ 2810 case "b": 2811 if (typeof subst !== "number") 2812 subst = 0; 2813 subst = subst.toString(2); 2814 break; 2815 2816 /* octal number */ 2817 case "o": 2818 if (typeof subst !== "number") 2819 subst = 0; 2820 subst = subst.toString(8); 2821 break; 2822 2823 /* unsigned decimal number */ 2824 case "u": 2825 if (typeof subst !== "number") 2826 subst = 0; 2827 subst = Math.abs(subst); 2828 subst = subst.toString(10); 2829 break; 2830 2831 /* (lower-case) hexadecimal number */ 2832 case "x": 2833 if (typeof subst !== "number") 2834 subst = 0; 2835 subst = subst.toString(16).toLowerCase(); 2836 if (pFlags.indexOf("#") >= 0) 2837 prefix = "0x"; 2838 break; 2839 2840 /* (upper-case) hexadecimal number */ 2841 case "X": 2842 if (typeof subst !== "number") 2843 subst = 0; 2844 subst = subst.toString(16).toUpperCase(); 2845 if (pFlags.indexOf("#") >= 0) 2846 prefix = "0X"; 2847 break; 2848 2849 /* (lower/upper-case) floating point number (fixed precision) */ 2850 case "f": 2851 case "F": 2852 if (typeof subst !== "number") 2853 subst = 0.0; 2854 subst = 0.0 + subst; 2855 if (precision > -1) { 2856 if (subst.toFixed) 2857 subst = subst.toFixed(precision); 2858 else { 2859 subst = (Math.round(subst * Math.pow(10, precision)) / Math.pow(10, precision)); 2860 subst += "0000000000"; 2861 subst = subst.substr(0, subst.indexOf(".") + precision + 1); 2862 } 2863 } 2864 subst = "" + subst; 2865 if (pFlags.indexOf("'") >= 0) { 2866 var k = 0; 2867 for (var i = (subst.length - 1) - 3; i >= 0; i -= 3) { 2868 subst = subst.substring(0, i) + (k === 0 ? "." : ",") + subst.substring(i); 2869 k = (k + 1) % 2; 2870 } 2871 } 2872 break; 2873 2874 /* (lower/upper-case) floating point number (exponential-based precision) */ 2875 case "e": 2876 case "E": 2877 if (typeof subst !== "number") 2878 subst = 0.0; 2879 subst = 0.0 + subst; 2880 if (precision > -1) { 2881 if (subst.toExponential) 2882 subst = subst.toExponential(precision); 2883 else 2884 throw new Error("sprintf: ERROR: toExponential() method not supported"); 2885 } 2886 subst = "" + subst; 2887 if (pType === "E") 2888 subst = subst.replace(/e\+/, "E+"); 2889 break; 2890 2891 /* single character */ 2892 case "c": 2893 if (typeof subst !== "number") 2894 subst = 0; 2895 subst = String.fromCharCode(subst); 2896 break; 2897 2898 /* string */ 2899 case "s": 2900 if (typeof subst !== "string") 2901 subst = String(subst); 2902 if (precision > -1) 2903 subst = subst.substr(0, precision); 2904 break; 2905 default: 2906 throw new Error("sprintf: ERROR: invalid conversion character \"" + pType + "\""); 2907 } 2908 2909 /* apply optional padding */ 2910 var padding = minLength - subst.toString().length - prefix.toString().length; 2911 if (padding > 0) { 2912 var arrTmp = new Array(padding + 1); 2913 if (justifyRight) 2914 subst = arrTmp.join(padWith) + subst; 2915 else 2916 subst = subst + arrTmp.join(padWith); 2917 } 2918 2919 /* add optional prefix */ 2920 subst = prefix + subst; 2921 } 2922 2923 /* update the processing queue */ 2924 done = done + pProlog + subst; 2925 todo = pEpilog; 2926 } 2927 2928 /* return finally formatted string */ 2929 return (done + todo); 2930 } 2931}; 2932 2933function isset() { 2934 // http://kevin.vanzonneveld.net 2935 // + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) 2936 // + improved by: FremyCompany 2937 // + improved by: Onno Marsman 2938 // + improved by: RafaÅ Kukawski 2939 // * example 1: isset( undefined, true); 2940 // * returns 1: false 2941 // * example 2: isset( 'Kevin van Zonneveld' ); 2942 // * returns 2: true 2943 var a = arguments, 2944 l = a.length, 2945 i = 0, 2946 undef; 2947 2948 if (l === 0) { 2949 throw new Error('Empty isset'); 2950 } 2951 2952 while (i !== l) { 2953 if (a[i] === undef || a[i] === null) { 2954 return false; 2955 } 2956 i++; 2957 } 2958 return true; 2959} 2960 2961/* Legacy functions */ 2962 2963function rsfp_geolocation(term, id, mapid, map, marker, geocoder, type) { 2964 return RSFormPro.initGeoLocation(term, id, mapid, map, marker, geocoder, type); 2965} 2966 2967function refreshCaptcha(componentId, captchaPath) { 2968 return RSFormPro.refreshCaptcha(componentId, captchaPath); 2969} 2970 2971function number_format(number, decimals, dec_point, thousands_sep) { 2972 return RSFormPro.formatNumber(number, decimals, dec_point, thousands_sep); 2973} 2974 2975function rsfp_toNumber(number, decimal, thousands, decimals) { 2976 return RSFormPro.toNumber(number, decimal, thousands, decimals); 2977} 2978 2979function rsfp_getForm(formId) { 2980 return RSFormPro.getForm(formId); 2981} 2982 2983function rsfp_getValue(formId, name) { 2984 return RSFormPro.getValue(formId, name); 2985} 2986 2987function rsfp_verifyChecked(formId, name, value) { 2988 return RSFormPro.isChecked(formId, name, value); 2989} 2990 2991function rsfp_getBlock(formId, block) { 2992 return RSFormPro.getBlock(formId, block); 2993} 2994 2995function rsfp_getFieldsByName(formId, name) { 2996 return RSFormPro.getFieldsByName(formId, name); 2997} 2998
2999function rsfp_addEvent(obj, evType, fn) { 3000 return RSFormProUtils.addEvent(obj, evType, fn); 3001} 3002 3003function rsfp_setDisplay(items, value) { 3004 return RSFormProUtils.setDisplay(items, value); 3005} 3006 3007function stringURLSafe(str) { 3008 return RSFormProUtils.getAlias(str); 3009} 3010 3011function rsfp_changePage(formId, page, totalPages, validate, errorClasses) { 3012 return RSFormPro.Pages.change(formId, page, totalPages, validate, errorClasses); 3013} 3014 3015function rsfp_hidePage(thePage) { 3016 return RSFormPro.Pages.hide(thePage); 3017} 3018 3019function rsfp_showPage(thePage) { 3020 return RSFormPro.Pages.show(thePage); 3021} 3022 3023function rsfp_checkValidDate(fieldName) { 3024 return RSFormPro.disableInvalidDates(fieldName); 3025} 3026 3027function rsfp_addCondition(formId, name, fnCondition) { 3028 return RSFormPro.Conditions.add(formId, name, fnCondition); 3029} 3030 3031function rsfp_runAllConditions(formId) { 3032 return RSFormPro.Conditions.runAll(formId); 3033} 3034 3035function rsfp_setCalculationsEvents(formId, fields) { 3036 return RSFormPro.Calculations.addEvents(formId, fields); 3037} 3038 3039function getElementsByClassName(className, tag, elm) { 3040 return RSFormProUtils.getElementsByClassName(className, tag, elm); 3041} 3042 3043function buildXmlHttp() { 3044 return RSFormPro.Ajax.getXHR(); 3045} 3046 3047function ajaxDisplayValidationErrors(formComponents, task, formId, data) { 3048 return RSFormPro.Ajax.displayValidationErrors(formComponents, task, formId, data); 3049} 3050 3051function ajaxValidation(form, page, errorClasses) { 3052 return RSFormPro.Ajax.validate(form, page, errorClasses); 3053}
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.