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.