PageSourceSearch

https://e-sogo.co.jp/media/com_rsform/js/script.js

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

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.