(function(factory){if(typeof define==='function'&&define.amd){define(['jquery'],factory)}else if(typeof exports==='object'){factory(require('jquery'))}else{factory(jQuery)}}(function($){var pluses=/\+/g;function encode(s){return config.raw?s:encodeURIComponent(s)}function decode(s){return config.raw?s:decodeURIComponent(s)}function stringifyCookieValue(value){return encode(config.json?JSON.stringify(value):String(value))}function parseCookieValue(s){if(s.indexOf('"')===0){s=s.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,'\\')}try{s=decodeURIComponent(s.replace(pluses,' '));return config.json?JSON.parse(s):s}catch(e){}}function read(s,converter){var value=config.raw?s:parseCookieValue(s);return $.isFunction(converter)?converter(value):value}var config=$.cookie=function(key,value,options){if(value!==undefined&&!$.isFunction(value)){options=$.extend({},config.defaults,options);if(typeof options.expires==='number'){var days=options.expires,t=options.expires=new Date();t.setTime(+t+days*864e+5)}return(document.cookie=[encode(key),'=',stringifyCookieValue(value),options.expires?'; expires='+options.expires.toUTCString():'',options.path?'; path='+options.path:'',options.domain?'; domain='+options.domain:'',options.secure?'; secure':''].join(''))}var result=key?undefined:{};var cookies=document.cookie?document.cookie.split('; '):[];for(var i=0,l=cookies.length;ie){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this); $.cookie.defaults = { expires : 365, path : "/" }; var ajaxURL = "/_c4/programs/engagement/v1/cfc/Remote.cfc"; var oneHour = 1000 * 60 * 60; var sessionRestartAfter = 5; var nowTime = new Date; var thisDomain = location.hostname; var thisPage = location.pathname; var dlgInit = 0; $(document).ready(function() { IsNewSession(); EngagementController(); $(window).trigger("scroll.scrollMarks"); }); function EngagementController() { var engage = $("#Engagement"); var engaged = 0; var userData = GetUserData(engage); engage.on("hide.bs.modal", function(e) { if (engaged == 1) EngagementEventHandler("engage", engage); else if (engaged == 2) EngagementEventHandler("hide", engage); else EngagementEventHandler("disengage", engage); }); $(".disengage, .close").on("click", function() { engaged = 0; }); $(".engage").on("click", function() { engaged = 1; engage.modal("hide"); }); $(".dont-show").on("click", function() { engaged = 2; engage.modal("hide"); }); if (engage.data("scroll") != "") { if (engage.data("id")) { $(window).on("scroll.scrollMarks", function() { ScrollHandler(this, engage); }); } } else { if (engage.data("id")) { dlgInit = window.setTimeout(function() { EngagementEventHandler("trigger", engage); }, engage.data("viewed")); } } } function EngagementEventHandler(evt, obj) { var userData = GetUserData(obj); switch (evt) { case "trigger": $.ajax({ type : "POST", url : ajaxURL, data : {method : 'UpdateEngagement', engagement : obj.data("id"), event : "trigger"}, cache : false, dataType : "JSON" }); SendEvent("trigger", obj); obj.modal("show"); break; case "engage": userData.e = 1; SetUserData(userData); $.ajax({ type : "POST", url : ajaxURL, data : {method : 'UpdateEngagement', engagement : obj.data("id"), event : "engage"}, cache : false, dataType : "JSON" }); SendEvent("engage", obj); $("#EngagementForm").submit(); if (obj.data("scroll") != "") { $(window).off('scroll.scrollMarks'); } else { if (obj.data("timer") > 0 && obj.data("end") == 0) { dlgInit = window.setTimeout(function() { EngagementEventHandler("trigger", obj); }, obj.data("timer")); } } break; case "disengage": userData.e = 0; SetUserData(userData); $.ajax({ type : "POST", url : ajaxURL, data : {method : 'UpdateEngagement', engagement : obj.data("id"), event : "disengage"}, cache : false, dataType : "JSON" }); SendEvent("disengage", obj); if (obj.data("scroll") != "") { $(window).off('scroll.scrollMarks'); } else { if (obj.data("timer") > 0 && (obj.data("end") == 0 || obj.data("end") == 1)) { dlgInit = window.setTimeout(function() { EngagementEventHandler("trigger", obj); }, obj.data("timer")); } } break; case "hide": userData.e = 2; SetUserData(userData); $.ajax({ type : "POST", url : ajaxURL, data : {method : 'UpdateEngagement', engagement : obj.data("id"), event : "disengage"}, cache : false, dataType : "JSON" }); SendEvent("disengage", obj); if (obj.data("scroll") != "") { $(window).off('scroll.scrollMarks'); } break; } return userData.e; } function ScrollHandler(wndw, obj) { clearTimeout($.data(wndw, 'scrollTimer')); $.data(wndw, 'scrollTimer', setTimeout(function() { var scrollTo = $.isNumeric(obj.data("scroll")) ? [obj.data("scroll")] : obj.data("scroll").split(","); var scrollTest = 0; var docHeight = $(document).height(); var winHeight = (window.innerHeight ? window.innerHeight : $(window).height()); var scrollDistance = (($(window).scrollTop() + winHeight)/docHeight)*100; if ($.isNumeric(scrollTo[0])) { for (var i = 0; i < scrollTo.length; i++) { if (scrollDistance >= scrollTo[i]) { scrollTest = 1; break; } } } else { for (i = 0; i < scrollTo.length; i++) { var element = $(scrollTo[i]); var elementPrcnt = (element.offset().top / docHeight)*100; scrollDistance = (($(window).scrollTop() + (winHeight-50))/docHeight)*100; if (scrollDistance >= elementPrcnt) { scrollTest = 1; break; } } } if (scrollTest) { var userData = GetUserData(obj); if ((obj.data("end") == 2 && userData["e"] < 0) || (obj.data("end") == 1 && userData["e"] < 1) || obj.data("end") == 0) { EngagementEventHandler("trigger", obj); } else $(window).off('scroll.scrollMarks'); } }, 250)); } function IsNewSession() { var newSession = 0; var url = document.createElement("a"); var sessionTime = new Date; url.href = document.referrer; if (thisPage.charAt(thisPage.length-1) == "/") thisPage += "index.cfm"; if (!$.cookie("sessionTime")) { newSession = 1; $.cookie("sessionTime", nowTime.toJSON()); } sessionTime = new Date($.cookie('sessionTime')); if (Math.ceil((nowTime - sessionTime)/oneHour) >= sessionRestartAfter) { newSession = 1; $.cookie("sessionTime", nowTime.toJSON()); } sessionTime = new Date($.cookie('sessionTime')); if (url.hostname.localeCompare(thisDomain) != 0) { newSession = 1; $.cookie("sessionTime", nowTime.toJSON()); } sessionTime = new Date($.cookie('sessionTime')); if (!$.cookie("numberSessions")) $.cookie("numberSessions", 0); if (!$.cookie("pagesViewed")) $.cookie("pagesViewed", JSON.stringify([thisPage])); if (!$.cookie("engagementData")) $.cookie("engagementData", JSON.stringify([])); if (newSession) { $.cookie("numberSessions", parseInt($.cookie("numberSessions"))+1); $.cookie("pagesViewed", JSON.stringify([thisPage])); } else { $.cookie("sessionTime", nowTime.toJSON()); var arrPages = $.cookie("pagesViewed") == "" ? [] : JSON.parse($.cookie("pagesViewed")); if (arrPages.indexOf(thisPage) < 0) { arrPages.push(thisPage); $.cookie("pagesViewed", JSON.stringify(arrPages)); } } return newSession; } function GetUserData(obj) { var userData = $.cookie("engagementData") == "" ? [] : JSON.parse($.cookie("engagementData")); var eid = parseInt(obj.data("id")); var dataObj = {b : eid, e : -1, w : new Date().toJSON()}; if (userData.length > 0) { for (var i = 0; i < userData.length; i++) { if (userData[i].b == eid) { dataObj = userData[i]; break; } } } return dataObj; } function SetUserData(obj) { var userData = $.cookie("engagementData") == "" ? [] : JSON.parse($.cookie("engagementData")); var eid = parseInt(obj.b); var found = 0; obj.w = new Date().toJSON(); if (userData.length > 0) { for (var i = 0; i < userData.length; i++) { if (userData[i].b == eid) { userData[i] = obj; found = 1; break; } } if (!found) userData.push(obj); } else userData.push(obj); $.cookie("engagementData", JSON.stringify(userData)); } function SendEvent(evt, obj) { var universalGA = 0; var classicGA = 0; // Determine which version of GA is being used // "ga", "_gaq" are the possible globals if (typeof ga === "function") universalGA = true; if (typeof _gaq !== "undefined" && typeof _gaq.push === "function") classicGA = true; if (universalGA) { ga('send', 'event', 'engagement-popup', evt, obj.data("name")); } if (classicGA) { _gaq.push(['_trackEvent', 'engagement-popup', evt, obj.data("name")]); } }