PageSourceSearch

https://tuscola.org/assets/js/cms/cms.js?v=1.0.37&m=1574742152

js tuscola.org collected 2026-10-02 17:16:54 UTC 11,088 bytes, 508 lines download raw bytes

1/**
2 * Form Validator
3 */
4var FORM_VALIDATOR = function($FORM, OPTIONS) {
5
6	if(typeof($FORM) == "undefined") { console.log("No Form Argument"); return false; }
7	if(typeof(OPTIONS) == "undefined") { OPTIONS = {}; }
8
9	/**
10	 * Configure options and default option fallbacks
11	 */
12	var DEFAULTS = {
13		"fill": false,
14		"nodes": {
15			"submit": $(".contact-form-submit", $FORM),
16			"loading": $(".contact-form-loading-icon", $FORM),
17			"message": $(".contact-form-message", $FORM),
18		},
19		"onValid": function(CONFIG) {},
20		"onInvalid": function(INVALID_ELEMENTS, MESSAGE) {},
21		"messages": {
22			"validating": "Validating...",
23			"required_fields": "Please fill in all required fields.",
24			"invalid_email": "E-mail address is invalid.",
25			"invalid_password": "Password is invalid.",
26			"success": "Your message has been sent!",
27			"unknown_error": "Unknown error."
28		}
29	};
30
31	OPTIONS = $.extend({}, DEFAULTS, OPTIONS);
32
33	var EXTEND_JSON = $("script[type='application/json']", $FORM),
34		EXTEND = EXTEND_JSON.length > 0 ? JSON.parse($.trim(EXTEND_JSON.html())) : false;
35
36	if(EXTEND) { OPTIONS = $.extend(true, OPTIONS, EXTEND); }
37
38	/**
39	 * Store instance for return value
40	 */
41	var MODULE = {};
42
43	/**
44	 * Store block ID
45	 */
46	var BLOCK_ID = $FORM.data("block");
47
48	/**
49	 * Message
50	 */
51	var MESSAGE_TIMEOUT = null;
52	var MESSAGE = function(MESSAGE, TYPE, TIMEOUT) {
53
54		if(typeof(MESSAGE) == "undefined") { MESSAGE = ""; }
55		if(typeof(TYPE) == "undefined") { TYPE = "loading"; }
56		if(typeof(TIMEOUT) == "undefined") { TIMEOUT = false; }
57
58		clearTimeout(MESSAGE_TIMEOUT);
59
60		var CLASSES = ['loading', 'success', 'error'];
61
62		$FORM.removeClass(CLASSES.join(" ")).addClass(TYPE);
63
64		OPTIONS["nodes"]["message"].html(MESSAGE);
65
66		if(TIMEOUT) {
67
68			MESSAGE_TIMEOUT = setTimeout(function() {
69
70				$FORM.removeClass(CLASSES.join(" "))
71				OPTIONS["nodes"]["message"].html("");
72
73			}, TIMEOUT);
74
75		}
76
77	};
78
79	/**
80	 * Initialize
81	 */
82	var INIT = function() {
83
84		CONDITIONALS["init"]();
85
86		if(OPTIONS["fill"]) {
87
88			$(".form-item", $FORM).each(function(i, DIV) {
89
90				var $ELEMENT = $("input,textarea,select", DIV).first();
91
92				if($ELEMENT.is(":visible")) {
93
94					if($ELEMENT.is(".checkbox-group input")) {
95
96						var $GROUP = $ELEMENT.closest('.checkbox-group'),
97							$INPUTS = $("input", $GROUP),
98							SIZE = $INPUTS.length,
99							RANDOM = Math.floor(Math.random() * SIZE) + 1;
100
101						$INPUTS.each(function(i, v) {
102
103							if(i < RANDOM) {
104								$(this).prop("checked", true).trigger('change');
105							}
106
107						});
108
109					} else if($ELEMENT.is(".radio-group input")) {
110
111						$ELEMENT.prop("checked", true).trigger('change');
112
113					} else if($ELEMENT.is("select")) {
114
115						var SELECTED_OPTION = "";
116
117						$("option", $ELEMENT).each(function() {
118
119							var VAL = $.trim($(this).val());
120
121							if(VAL != "") {
122								SELECTED_OPTION = VAL;
123							}
124
125						});
126
127						$ELEMENT.val(SELECTED_OPTION).trigger('change');
128
129					} else {
130
131						var RANDOM_STRING = Math.random().toString(36).slice(2);
132
133						if($ELEMENT.data("email")) { RANDOM_STRING += "@test.com"; }
134						if($ELEMENT.data("mask")) { RANDOM_STRING = $ELEMENT.data("mask"); }
135
136						$ELEMENT.val(RANDOM_STRING).trigger('keyup');
137
138					}
139
140				}
141
142			});
143
144		}
145
146		// Submit Button Click
147		OPTIONS["nodes"]["submit"].on('click', function(event) {
148
149			event.preventDefault();
150
151			MODULE["validate"]();
152
153		});
154
155		// Submit on enter keydown
156		$("input:not([type='checkbox']):not([type='radio'])", $FORM).on('keydown', function(event) {
157
158			if(event && event.keyCode && event.keyCode == 13) {
159				event.preventDefault();
160				MODULE["validate"]();
161			}
162
163		});
164
165		// Clear invalid on change
166		$FORM.on('change keyup', '.form-invalid', function(event) {
167
168			$(this).removeClass("form-invalid");
169
170			if($(".form-invalid", $FORM).length === 0) {
171
172                MESSAGE("", "success");
173
174            }
175
176		});
177
178		// Apply MaskedInput masks
179		$("input[data-mask], textarea[data-mask]", $FORM).each(function(i,v) {
180			var input = $(this);
181			input.mask(input.data("mask").toString());
182		});
183
184	};
185
186	/**
187	 * Check for blanks / unchecked
188	 */
189	var CHECK = {
190
191		"from": function(ON_SUCCESS) {
192
193			if(typeof(ON_SUCCESS) == "undefined") { ON_SUCCESS = function() {}; }
194
195			var $NAME_ELEMENT = $("[data-name='true']", $FORM),
196				$EMAIL_ELEMENT = $("[data-email='true']", $FORM);
197
198			var NAME = "",
199				EMAIL = $EMAIL_ELEMENT.val();
200
201			if($NAME_ELEMENT.length > 1) {
202
203				var MULTI = "";
204
205				$NAME_ELEMENT.each(function(i,v) {
206					MULTI = MULTI + $(this).val();
207					if(i < $NAME_ELEMENT.length - 1) { MULTI = MULTI + " "; }
208				});
209
210				NAME = MULTI;
211
212			} else {
213				NAME = $NAME_ELEMENT.val();
214			}
215
216			ON_SUCCESS({
217				"name": {
218					"element": $NAME_ELEMENT,
219					"string": NAME
220				},
221				"email": {
222					"element": $EMAIL_ELEMENT,
223					"string": EMAIL
224				}
225			});
226
227		},
228
229		"blanks": function(ON_SUCCESS) {
230
231			if(typeof(ON_SUCCESS) == "undefined") { ON_SUCCESS = function() {}; }
232
233			var INVALID_ELEMENTS = [];
234
235			$("[data-required]:visible", $FORM).each(function(i, ELEMENT) {
236
237				var $ELEMENT = $(ELEMENT),
238					INVALID = false;
239
240				if($ELEMENT.is(".checkbox-group")) {
241
242					var REQUIRED = parseInt($ELEMENT.data("required"));
243
244					if(isNaN(REQUIRED)) { REQUIRED = 1; }
245
246					if($("input[type='checkbox']:checked", $ELEMENT).length < REQUIRED) { INVALID = true; }
247
248				} else if($ELEMENT.is(".radio-group")) {
249
250					if($("input[type='radio']:checked", $ELEMENT).length == 0) { INVALID = true; }
251
252				} else if($ELEMENT.is("[type='checkbox']")) {
253
254					if(!$ELEMENT.is(":checked")) { INVALID = true; }
255
256				} else if($ELEMENT.is("select")) {
257
258					if($.trim($ELEMENT.val()) == "" || $.trim($ELEMENT.val()) == "null") { INVALID = true; }
259
260				} else {
261
262					if($.trim($ELEMENT.val()) == "") { INVALID = true; }
263
264				}
265
266				if(INVALID) {
267
268					$ELEMENT.addClass("form-invalid");
269
270					INVALID_ELEMENTS.push($ELEMENT);
271
272				}
273
274			});
275
276			if(INVALID_ELEMENTS.length > 0) {
277
278				MESSAGE(OPTIONS["messages"]["required_fields"], "error");
279				OPTIONS["onInvalid"](INVALID_ELEMENTS, OPTIONS["messages"]["required_fields"]);
280
281			} else {
282
283				ON_SUCCESS();
284
285			}
286
287		},
288
289		"email": function(FROM, ON_SUCCESS) {
290
291			if(typeof(FROM) == "undefined") { FROM = {}; }
292			if(typeof(ON_SUCCESS) == "undefined") { ON_SUCCESS = function() {}; }
293
294			var REGEX = /^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!\.)){0,61}[a-zA-Z0-9]?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9\-](?!$)){0,61}[a-zA-Z0-9]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/;
295
296			if(FROM["email"]["string"].match(REGEX)) {
297
298				ON_SUCCESS();
299
300			} else {
301
302				MESSAGE(OPTIONS["messages"]["invalid_email"], "error");
303				FROM["email"]["element"].addClass("form-invalid");
304
305				OPTIONS["onInvalid"]([FROM["email"]["element"]], OPTIONS["messages"]["invalid_email"]);
306
307			}
308
309		},
310
311	};
312
313	/**
314	 * Run Validator
315	 */
316	var CONDITIONALS = {
317
318		"init": function() {
319
320			var $TRIGGERS = $("[data-conditional]", $FORM),
321				$CONDITIONS = $("[data-condition]", $FORM);
322
323			$CONDITIONS.hide();
324
325			$TRIGGERS.on('change keyup', function(event) {
326
327				var $TRIGGER = $(this),
328					$CONDITION = $CONDITIONS.filter("[data-condition='" + $TRIGGER.data("conditional") + "']");
329
330				TOGGLE = true;
331
332				if($TRIGGER.is("[type='checkbox']") || $TRIGGER.is("[type='radio']")) {
333
334					if(!$TRIGGER.is(":checked")) {
335
336						TOGGLE = false;
337
338					}
339
340				} else {
341
342					var VAL = $.trim($TRIGGER.val());
343
344					if($.inArray(VAL, ["", "null"]) !== -1) {
345
346						TOGGLE = false;
347
348					}
349
350				}
351
352				if(TOGGLE) {
353					$CONDITION.slideDown(200);
354				} else {
355					$CONDITION.slideUp(200, function() {
356						$("input,textarea,select", $CONDITION).val(function() {
357							return this.defaultValue;
358						});
359					});
360				}
361
362			});
363
364		}
365
366	};
367
368	/**
369	 * Run Validator
370	 */
371	MODULE["validate"] = function() {
372
373		MESSAGE(OPTIONS["messages"]["validating"]);
374
375		$(".form-invalid", $FORM).removeClass("form-invalid");
376
377		CHECK["from"](function(FROM) {
378
379			CHECK["blanks"](function() {
380
381				CHECK["email"](FROM, function() {
382
383					MESSAGE("", "success");
384
385					//$FORM.find("textarea[value=''], input[type='text'][value='']").val("");
386
387					var SERIALIZED = $FORM.serializeArray();
388
389					var TRANSFORM_SERIALIZED = Array();
390
391					$.each(SERIALIZED, function(i, ITEM) {
392
393						if(typeof(ITEM["name"]) != "undefined" && ITEM["name"] != "") {
394							TRANSFORM_SERIALIZED.push(ITEM);
395						}
396
397					});
398
399					SERIALIZED = TRANSFORM_SERIALIZED;
400
401					OPTIONS["onValid"]({
402						"block_id": BLOCK_ID,
403						"from": {
404							"name": FROM["name"]["string"],
405							"email": FROM["email"]["string"]
406						},
407						"serialized": SERIALIZED,
408						"messages": OPTIONS["messages"]
409					}, OPTIONS);
410
411				});
412
413			});
414
415		});
416
417	};
418
419	/**
420	 * Display Custom Success Message (If enabled)
421	 */
422	MODULE["customSuccessMessage"] = function($TARGET) {
423
424		if(typeof($TARGET) == "undefined") { var $TARGET = $FORM; }
425
426		CMS.block.get(BLOCK_ID, function(BLOCK) {
427
428			if(typeof(BLOCK["settings"]["Form Success Message"]) != "undefined") {
429
430				var $SUCCESS = $("<div />");
431					$SUCCESS.hide().addClass("contact-form-success-message");
432
433				$SUCCESS.html(BLOCK["data"][0]["html"]);
434
435				$TARGET.before($SUCCESS);
436				$TARGET.hide();
437
438				$("#footer-contact-title, #footer-contact-submit").fadeOut(200);
439
440				$("html,body").animate({ scrollTop: $FORM.closest("[data-section]").offset().top }, 200);
441
442				$SUCCESS.slideDown(200, function() {
443
444				});
445
446			}
447
448		});
449
450	};
451
452	/**
453	 * Public message method
454	 */
455	MODULE["message"] = function(MSG, TYPE, TIMEOUT) {
456
457		if(typeof(MSG) == "undefined") { MSG = ""; }
458		if(typeof(TYPE) == "undefined") { TYPE = "loading"; }
459		if(typeof(TIMEOUT) == "undefined") { TIMEOUT = false; }
460
461		MESSAGE(MSG, TYPE, TIMEOUT);
462
463	};
464
465	INIT();
466
467	return MODULE;
468
469}
470
471
472///////////////////////////////////////////////////////////////////
473
474var CMS = {};
475
476var CENTRAL_CORE_URL = window.location.host.substr(-4) == ".dev" ? "https://centralcore.dev" : "https://assets.cms.cybernautic.com";
477
478$.getScript(CENTRAL_CORE_URL + "/latest/assets/js/cms-frontend-framework.js", function() {
479
480	new CMSFrontendFramework(function(HELPERS) {
481
482		jQuery.extend(CMS, HELPERS);
483
484		//$.getScript("/assets/js/cms/form-validator.js", function() {
485			$.getScript("/assets/js/cms/email-form.js", function() {
486
487					$("[data-module='email-form']").each(function(i,v) { new EMAIL_FORM($(this)); });
488
489					///////////////////////////////////////////////////////////////////////
490					// External Links
491					///////////////////////////////////////////////////////////////////////
492
493					CMS.externalLinks();
494
495					///////////////////////////////////////////////////////////////////////
496					// Draft Pages
497					///////////////////////////////////////////////////////////////////////
498
499					if(CMS.page.draft) {
500						$("body").prepend('<div style="position: fixed;top: 5px;left: 5px;background: rgba(255,0,0,0.3);padding: 8px 16px;font-style: italic;color: #fff;text-shadow: 1px 1px 1px rgba(0,0,0,0.2);z-index: 9999999;">Draft</div>');
501					}
502
503			});
504		//});
505
506	});
507
508});

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.