PageSourceSearch

https://www.farmakapsa.cz/media/com_rsform/js/script.js?a12edd6d5a76202310ac289621d44710

js farmakapsa.cz collected 2026-10-08 06:11:30 UTC 91,833 bytes, 3,053 lines download raw bytes

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 = '&times;';
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 = '&times;';
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.