1/** XENOPSI Common JS functions v.1.2.0 (June 2015) **/ 2(function ($) { 3 $.expr[':'].external = function (obj) { 4 return !obj.href.match(/^mailto:/) && !obj.href.match(/^tel:/) && !obj.href.match(/^#/) && !obj.href == "" && !obj.href.match(/^javascript:/) && (obj.target.toLowerCase() == "_blank" || (obj.hostname.replace(/^www\./i, '') != document.location.hostname.replace(/^www\./i, ''))); 5 }; 6}(jQuery)); 7var _xm = { 8 timmers: [], refresh: function (elm, forceRefresh) { 9 if ((typeof elm == "undefined")) { 10 elm = $(document); 11 } 12 if ((typeof forceRefresh == "undefined")) { 13 forceRefresh = false; 14 } 15 elm.find('a[href="#"]').each(function (i, v) { 16 if ($(this).data('xmAnchor') != true) { 17 $(this).data('xmAnchor', true).click(function (e) { 18 e.preventDefault(); 19 }); 20 } 21 }); 22 elm.find("input:text , input:password, textarea").each(function (i, v) { 23 if ($(this).data('xmInput') != true) { 24 $(this).data('xmInput', true).focus(function () { 25 if ($(this).attr("data-title") && $(this).val() == $(this).attr("data-title")) { 26 $(this).val(""); 27 } 28 }).blur(function () { 29 if ($(this).val() == "" && $(this).attr("data-title")) { 30 $(this).val($(this).attr("data-title")); 31 } 32 }); 33 } 34 }); 35 elm.find('a:external').each(function (i, v) { 36 if ($(this).data('xmExternal') != true) { 37 $(this).data('xmExternal', true).click(function (e) { 38 if (!$(this)[0].hasAttribute('data-track')) { 39 if ($(this).data("title")) { 40 _xm.pushEvent("outbound", $(this).data("title"), $(this).attr("href")); 41 } else { 42 _xm.pushEvent("outbound", $(this).attr("href")); 43 } 44 } 45 }); 46 } 47 }); 48 elm.find("[data-track]").each(function (i, v) { 49 if ($(this).data('xmTrack') != true) { 50 $(this).data('xmTrack', true).click(function (e) { 51 var tc = $(this).data("track"); 52 _xm.pushString(tc); 53 if ($(this).attr("href") == "#") e.preventDefault(); 54 }) 55 } 56 }); 57 elm.find("[data-track-hover]").each(function (i, v) { 58 if ($(this).data('xmTrackHover') != true) { 59 $(this).data('xmTrackHover', true).mouseenter(function (e) { 60 var tc = $(this).data("track-hover"); 61 _xm.pushString(tc); 62 }) 63 } 64 }); 65 elm.find('form').each(function (i, v) { 66 _xm.setupForm($(this)); 67 }) 68 69 elm.find("[data-init]").each(function () { 70 if ($(this).attr('data-initialized') != 1) { 71 var funName = $(this).data("init"); 72 window[funName](); 73 $(this).attr('data-initialized', 1); 74 } 75 }); 76 }, pushEvent: function (_cat, _act, _param, _value) { 77 if (typeof _value != 'undefined') { 78 gtag('event', _param, {'event_category': _act, 'event_label': _cat, 'value': _value}); 79 } else if (typeof _param != 'undefined') { 80 gtag('event', _param, {'event_category': _act, 'event_label': _cat}); 81 } else if (typeof _act != 'undefined') { 82 gtag('event', _act, {'event_category': _cat, 'event_label': _act}); 83 } else if (typeof _cat != 'undefined') { 84 gtag('event', _act, {'event_category': 'Click', 'event_label': _act}); 85 } 86 }, pushString: function (str) { 87 var arr = str.split("|"); 88 if (arr.length > 3) { 89 _xm.pushEvent(arr[0], arr[1], arr[2], arr[3]); 90 } else if (arr.length > 2) { 91 _xm.pushEvent(arr[0], arr[1], arr[2]); 92 } else if (arr.length > 1) { 93 _xm.pushEvent(arr[0], arr[1]); 94 } else { 95 _xm.pushEvent(arr[0], "click"); 96 } 97 }, timerStart: function (_cat) { 98 var ct = new Date().getTime(); 99 _xm.timmers[_cat] = ct; 100 }, timerEnd: function (_cat, _act, _param) { 101 var ct = new Date().getTime(); 102 var ts = _xm.timmers[_cat]; 103 if (ts) { 104 var timeSpent = ct - ts; 105 _xm.timmers[_cat] = null; 106 if (typeof _param == 'undefined') { 107 gtag('event', 'timing', {'event_category': _act, 'event_label': _
107cat, 'value': timeSpent}); 108 } else { 109 gtag('event', _param, {'event_category': _act, 'event_label': _cat, 'value': timeSpent}); 110 } 111 } 112 }, cleanupDefaults: function ($frm) { 113 $(".asterik").removeClass("error").html($(".asterik").data("title")); 114 $frm.find("input[type='text'], textarea").each(function (index, element) { 115 if ($(this).val() == $(this).data("title")) $(this).val(""); 116 }); 117 }, resetForm: function ($frm) { 118 $frm[0].reset(); 119 $frm.find('[data-title]').trigger('blur'); 120 $frm.find('select').trigger('chosen:updated'); 121 }, setupForm: function ($form) { 122 var fieldVal = ''; 123 $form.find('[data-empty]').each(function (i, v) { 124 125 var $field = $(this); 126 if (!$field.attr('data-title')) { 127 $field.attr('data-title', ''); 128 } 129 if ($field.attr('name')) 130 fieldVal += $field.attr('name') + "|empty|" + $field.data("title") + "|" + $field.data("empty") + "~"; 131 if ($field.data('validate')) { 132 fieldVal += $field.attr('name') + "|" + $field.data('validate') + "|" + $field.data("title") + "|" + $field.data("invalid") + "~"; 133 } 134 }); 135 if ($form.find('input[name="xmsetup"]').length == 0) { 136 $form.prepend('<input type="hidden" name="xmsetup">'); 137 } 138 $form.find('input[name="xmsetup"]').val(fieldVal); 139 var notRequiredFields = ''; 140 $form.find('input[type="text"],input[type="email"],input[type="url"],input[type="time"],input[type="date"], textarea, select').not('[data-empty]').each(function (i, v) { 141 var $field = $(this); 142 if ($field.attr('name')) 143 notRequiredFields += $field.attr('name') + "|" + $field.data("title") + "~"; 144 }); 145 if ($form.find('input[name="xmsetupignore"]').length == 0) { 146 $form.prepend('<input type="hidden" name="xmsetupignore">'); 147 } 148 $form.find('input[name="xmsetupignore"]').val(notRequiredFields); 149 $form.find('[data-title]').trigger('blur'); 150 if ($form.attr('data-action')) { 151 $form.find("input[type='text']").off("keypress").on("keypress", function (e) { 152 if (e.which == 13) { 153 e.preventDefault(); 154 _xm.submitForm($form); 155 } 156 }); 157 $form.find('button[type="submit"], input[type="submit"]').off("
157click").on("click", function (e) { 158 _xm.submitForm($form); 159 }); 160 } 161 }, validateForm: function ($frm) { 162 var isValid = true; 163 var errorMessage = ''; 164 var $errorField; 165 _xm.removeAllErrors(); 166 $frm.find('[data-empty]').each(function (i, v) { 167 var $field = $(this); 168 if (($field.is(':checkbox') && !$field.is(':checked')) || Validate.empty($field.val()) || $field.val() == $field.attr("data-title")) { 169 $field.addClass("error"); 170 $errorField = $field; 171 errorMessage = $field.attr("data-empty"); 172 if (DEVICE_TYPE == 'phone') { 173 alert(errorMessage); 174 $field.focus(); 175 } 176 else 177 $(_xm.getErrorHTML(errorMessage)).insertBefore($errorField); 178 if ($field.is('select')) { 179 setTimeout(function () { 180 $field.first().trigger('chosen:open'); 181 }, 200); 182 } else { 183 $field.focus(); 184 } 185 $field.on('change', function () { 186 $field.siblings('.xm-tooltip').remove() 187 }); 188 return isValid = false; 189 } 190 if (isValid && $field.attr('data-validate')) { 191 if (!Validate[$field.attr('data-validate')]($field.val())) { 192 $field.addClass("error"); 193 $errorField = $field; 194 errorMessage = $field.attr("data-invalid"); 195 if (DEVICE_TYPE == 'phone') alert(errorMessage); 196 else 197 $(_xm.getErrorHTML(errorMessage)).insertBefore($errorField); 198 $field.focus(); 199 $field.on('change', function () { 200 $field.siblings('.xm-tooltip').remove() 201 }); 202 return isValid = false; 203 } 204 } 205 }); 206 if (!isValid) { 207 return {result: false, field: $errorField, error: errorMessage}; 208 } else { 209 return true; 210 } 211 212 }, submitForm: function ($form) { 213 if ($form.attr('data-submitting') == true) { 214 return false; 215 } 216 var isValid = _xm.validateForm($form); 217 //$('[name=instagram],[name=facebook],[name=website]').on('blur',function(){ 218 var urlPatt = new RegExp(/^(http(s)?:\/\/)?(www\.)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/); 219 var hasNumber = /\d/; 220 221 if($('[name=phone_number]').length > 0){ 222 if(hasNumber.test($("input[name=phone_number]").val()) == true && $("input[name=phone_number]").val().search(/_/) >= 0) { 223 $("input[name=phone_number]").focus(); 224 $("input[name=phone_number]").before('<div class="xm-tooltip">'+$("input[name=phone_number]").attr('data-invalid')+'</div>'); 225 isValid = false; 226 } 227 } 228 229 if($('[name=instagram]').length > 0){ 230 if($('[name=instagram]').val() != ''){ 231 if(!urlPatt.test($('[name=instagram]').val())){ 232 $('[name=instagram]').focus(); 233 $('[name=instagram]').before('<div class="xm-tooltip">Please enter a valid url</div>'); 234 isValid = false; 235 } 236 } 237 } 238 239 if($('[name=facebook]').length > 0){ 240 if($('[name=facebook]').val() != ''){ 241 if(!urlPatt.test($('[name=facebook]').val())){ 242 $('[name=facebook]').focus(); 243 $('[name=facebook]').before('<div class="xm-tooltip">Please enter a valid url</div>'); 244 isValid = false; 245 } 246 } 247 } 248 249 if($('[name=website]').length > 0){ 250 if($('[name=website]').val() != ''){ 251 if(!urlPatt.test($('[name=website]').val())){ 252 $('[name=website]').focus(); 253 $('[name=website]').before('<div class="xm-tooltip">Please enter a valid url</div>'); 254 isValid = false; 255 } 256 } 257 } 258 259 if($('#ingredients').length > 0){ 260 if($('#ingredients').val().indexOf('Elijah Craig') == -1 ){ 261 $('.ingredients-area').before("<div class='xm-tooltip'>"+$('.ingredients-area').attr('data-invalid')+"</div>"); 262 isValid = false; 263 } 264 } 265 266 if (isValid != true) { 267 //_xm.removeAllErrors(); 268 _xm.pushEvent($form.attr('id'), 'error', isValid.error); 269 if (DEVICE_TYPE == 'phone') { 270 //alert(isValid.error); 271 } else { 272 // $form.prepend(_xm.getErrorHTML(isValid.error)); 273 } 274 } else { 275 _xm.cleanupDefaults($form); 276 $form.attr('data-submitting', true); 277 $.ajax({
278 url: $form.attr('data-action'), type: 'POST', data: $form.serialize(), cache: false, dataType: 'json', 279 success: function (data) { 280 if (data.success == true) { 281 _xm.resetForm($form); 282 $form.prepend(_xm.getThankyouHTML($form.attr('data-thankyou'))); 283 _xm.pushEvent($form.attr('id'), 'submit', "complete"); 284 if ($form.attr('data-submit-complete')) { 285 var funName = $form.data("submit-complete"); 286 window[funName](data); 287 } 288 if ($form.attr('data-track-submit')) { 289 _xm.pushString($form.attr('data-track-submit')); 290 } 291 } else { 292 if (typeof data.errors.field != 'undefined') { 293 294 if (DEVICE_TYPE == 'phone') 295 { 296 alert(data.errors.reason); 297 $('input[name="'+data.errors.field +'"]').focus() 298 $.scrollTo($('input[name="'+data.errors.field +'"]').offset().top - 200, 400, {axis: "y"}); 299 } 300 301 var $errorfield = $form.find('[name="' + data.errors.field + '"]').first(); 302 if ($errorfield.length == 1) { 303 $(_xm.getErrorHTML(_xm.getErrorHTML(data.errors.reason))).insertBefore($errorfield); 304 305 } else { 306 $form.prepend(_xm.getErrorHTML(data.errors.reason)); 307 } 308 309 } else 310 $form.prepend(_xm.getErrorHTML(data.errors.reason)); 311 } 312 $form.attr('data-submitting', false); 313 }, 314 error: function (jqXHR, textStatus, errorThrown) { 315 $form.attr('data-submitting', false); 316 } 317 }); 318 } 319 320 }, removeAllErrors: function () { 321 $('.xm-tooltip').remove(); 322 $('.alert').remove(); 323 $("form").find('.error').removeClass('error'); 324 $("form").find(".valid").removeClass('valid'); 325 $("form").find(".invalid").removeClass('invalid'); 326 }, getErrorHTML: function (str) { 327 return '<div class="xm-tooltip">' + str + '</div>'; 328 return '<div class="alert alert-danger">' + str + '</div>'; 329 }, getThankyouHTML: function (str) { 330 return '<div class="alert alert-success">' + str + '</div>'; 331 } 332}; 333$(document).ready(function () { 334 _xm.refresh(); 335 $('[data-mask]').each(function () { 336 if ($(this).data('mask') == 'email') { 337 $(this).inputmask({ 338 showMaskOnHover: false, 339 mask: "*{1,20}[.*{1,20}][.*{1,20}][.*{1,20}]@*{1,20}[.*{2,6}][.*{1,2}]", 340 greedy: false, 341 onBeforePaste: function (pastedValue, opts) { 342 pastedValue = pastedValue.toLowerCase(); 343 return pastedValue.replace("mailto:", ""); 344 }, 345 definitions: { 346 '*': { 347 validator: "[0-9A-Za-z!#$%&'*+/=?^_`{|}~\-]", 348 cardinality: 1, 349 casing: "lower" 350 } 351 } 352 }); 353 } else { 354 $(this).inputmask({ 355 showMaskOnHover: false, 356 mask: $(this).data('mask') 357 }); 358 } 359 }); 360 if (DEVICE_TYPE != 'computer') { 361 $('input[data-keyboard]').each(function () { 362 if ($(this).data('keyboard') == 'float') { 363 $(this).attr('type', 'number'); 364 $(this).attr('pattern', '[0-9]*\.[0-9]*'); 365 $(this).attr('inputmode', 'numeric'); 366 } else if ($(this).data('keyboard') == 'number') { 367 $(this).attr('type', 'number'); 368 $(this).attr('pattern', '[0-9]*'); 369 $(this).attr('inputmode', 'numeric'); 370 } else if ($(this).data('keyboard') == 'phone') { 371 $(this).attr('type', 'tel'); 372 $(this).attr('pattern', '([0-9]3) [0-9]3-[0-9]4'); 373 $(this).attr('inputmode', 'numeric'); 374 } else if ($(this).data('keyboard') == 'zip') { 375 $(this).attr('type', 'tel'); 376 $(this).attr('pattern', '[0-9]*'); 377 $(this).attr('inputmode', 'numeric'); 378 } else if ($(this).data('keyboard') == 'email') { 379 $(this).attr('type', 'email'); 380 } 381 }); 382 } 383 384 if ($('.xpMaterial').length) { 385 $('.xpMaterial').find(".form-control").each(function () { 386 if ($(this).val() != "") { 387 $(this).parent('.xpMaterial').addClass('notempty'); 388 } else { 389 $(this).parent('.xpMaterial').removeClass('notempty'); 390 } 391 }); 392 393 $('.form-control').focusout(function () { 394 if ($(this).val() != "") { 395 $(this).parent('.xpMaterial').addClass('notempty'); 396 } else { 397 $(this).parent('.xpMaterial').removeClass('notempty'); 398 } 399 }); 400 $('.form-control').focusin(function () { 401 $(this).parent('.xpMaterial').addClass('notempty'); 402 }); 403 404 $('.form-control').on('change keyup', function () { 405 if ($(this).val() != "") { 406 $(this).parent('.xpMaterial').addClass('notempty'); 407 } else { 408 $(this).parent('.xpMaterial').removeClass('notempty'); 409 } 410 }); 411 $('select.chosen-select').change(function () { 412 var materialVal = $(this).chosen({disable_search_threshold: 5}).val(); 413 if (materialVal != '' || materialVal.length > 0) { 414 $(this).parent('.xpMaterial').addClass('notempty'); 415 } else { 416 $(this).parent('.xpMaterial').removeClass('notempty'); 417 } 418 }).trigger('change'); 419 } 420 421}); 422$(window).on("load",function () { 423 $('[data-class-onload]').each(function (i, v) { 424 var p = $(this).attr('data-class-onload').split('|'); 425 for (var i = 0; i < p.length; i++) { 426 $(this).addClass(p[i]); 427 } 428 });
429 //lazy loading 430 // $("img").unveil(0, function () { 431 // $(this).on("load",function () { 432 // this.style.opacity = 1; 433 // }); 434 // }); 435 // $("img").trigger("unveil"); 436}); 437// End XenoPsi Common JS functions 438var callAjax = function (config) { 439 var xhr; 440 var attempt = 0; 441 var maxAttempts = config.maxAttempts || 5; 442 443 function processCall() { 444 if (attempt++ < maxAttempts) { 445 xhr = $.ajax({ 446 type: config.type || 'GET', 447 url: config.url, 448 data: config.data, 449 success: function (responseData, textStatus, jqXHR) { 450 config.success(responseData); 451 }, 452 error: function (jqXHR, textStatus, errorThrown) { 453 setTimeout(processCall, config.retryAfter || 1000); 454 } 455 }); 456 } 457 else { 458 if (xhr && xhr.readystate != 4) { 459 xhr.abort(); 460 } 461 xhr = null; 462 config.error(); 463 } 464 } 465 466 processCall(); 467 return { 468 abort: function () { 469 attempt = maxAttempts; //no more attempts after abort 470 if (xhr && xhr.readystate != 4) { 471 xhr.abort(); 472 } 473 } 474 } 475}; 476// Avoid `console` errors in browsers that lack a console. 477!function () { 478 for (var o, e = function () { 479 }, n = ["assert", "clear", "count", "debug", "dir", "dirxml", "error", "exception", "group", "groupCollapsed", "groupEnd", "info", "log", "markTimeline", "profile", "profileEnd", "table", "time", "timeEnd", "timeStamp", "trace", "warn"], r = n.length, i = window.console = window.console || {}; r--;)o = n[r], i[o] || (i[o] = e) 480}(); 481//Validate Plugin 482var Validate = {}; 483Validate.isset = function (t) { 484 return !!t 485}, Validate.empty = function (t) { 486 return 0 == t.replace(/\s+/g, "").length 487}, Validate.email = function (t) { 488 return /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/i.test(t) 489}, Validate.date = function (t, e) { 490 var a = Date.parse(t); 491 if (isFinite(a))return !0; 492 if (e) { 493 var n = new Date; 494 return t = t.replace(/\d{4}/, n.getFullYear()), a = Date.parse(t), isFinite(a) 495 } 496 return !1 497}, Validate.zip = function (t, e) { 498 var a = e ? /^\d{5}-\d{4}$/ : /^\d{5}$/; 499 return a.test(t) 500}, Validate.phone = function (t) { 501 return /^\(?([0-9]{3})\)?[-.\s]?([0-9]{3})[-.\s]?([0-9]{4})$/.test(t) 502}, Validate.creditCard = function (t) { 503 var e = /^[\d-\s]$/.test(t); 504 return e ? Validate.luhn(t) : !1 505}, Validate.luhn = function (t) { 506 for (var e = t.replace(/\d+/g, ""), a = e.split(""), n = a.length, r = n % 2, i = 0, u = 0; n > u; u++) { 507 var d = a[u]; 508 u % 2 == r && (d *= 2, d > 9 && (d -= 9)), i += d 509 } 510 return i % 10 == 0 511}, Validate.integer = function (t) { 512 return /^\-?\d+$/.test(t) 513}, Validate.numeric = function (t) { 514 return /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(t) 515}, Validate.currency = function (t) { 516 return /^\$-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(t) 517}, Validate.ip = function (t) { 518 return /^((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})$/.test(t) 519}, Validate.ssn = function (t) { 520 return /^\d{3}-\d{2}-\d{4}$/.test(t) 521}, Validate.tin = function (t) { 522 return /^\d{2}-\d{7}$/.test(t) 523}, Validate.base64 = function (t) { 524 return /[^a-zA-Z0-9\/\+=]/i.test(t) 525}, Validate.alpha = function (t) { 526 return /^[a-z]$/i.test(t) 527}, Validate.alphaNumeric = function (t) { 528 return /^[a-z0-9]$/i.test(t) 529}, Validate.lowercase = function (t) { 530 return t.toLowerCase() == t 531}, Validate.uppercase = function (t) { 532 return t.toUpperCase() == t 533}, Validate.min = function (t, e) { 534 return t.length >= e 535}, Validate.max = function (t, e) { 536 return t.length <= e 537}, Validate.between = function (t, e, a) { 538 return t.length >= e && t.length <= a 539}, Validate.username = function (t) { 540 return /^[0-9a-zA-Z]+$/.test(t) && t.length >= 3 541},Validate.age = function (t) { 542 return true; 543},Validate.serialno = function (t, e) { 544 var a = e ? /^\d{7}-\d{7}$/ : /^\d{7}$/; 545 return a.test(t) 546};
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.