var streamPayments = (function () { var apiUrl = "https://derbycountyfcpayments.streamamg.com/api/v1"; var apiLanguage = "en"; var sessionDataName = "StreamPaymentSessionData"; var packagesName = "StreamPaymentPackages"; var loginCallbackName = "StreamPaymentLoginCallback"; var jwtToken = ""; var jwtLogin = "true" === "true"; //Initialize function var init = function (data, language) { loadjQuery(); if (typeof data === "string") { console.log("Using obsolete payment init"); // Url can no longer be specified it comes from the template value if (language) { apiLanguage = language; } } else if (typeof data === "object") { jwtToken = data.jwtToken; apiLanguage = data.language; } var loginCallback = getCachedData(loginCallbackName); if (loginCallback) { localStorage.removeItem(loginCallbackName); var sessionData = getCachedData(sessionDataName); loginCallback(sessionData); } registerRedirectCleans(); }; var getSubscriptionPackageList = function (options, callback) { var packages = getCachedData(packagesName); if (packages) { doCallback(callback, packages); return; } var ajaxOptions = { type: "GET", url: apiUrl + "/package/", data: options, success: function (data) { doCallback(callback, data); } }; $.ajax(prepAjaxOptions(ajaxOptions)); }; var getSessionState = function (options, callback) { console.log("getSessionState called"); if (typeof (streamLocalSessionDataInUse) != 'undefined') { if (streamLocalSessionDataInUse == true) { console.log("Returning streamLocalSessionData"); doCallback(callback, streamLocalSessionData); return; } } var sessionData = getCachedData(sessionDataName); var sessionDataValid = false; if (sessionData && sessionData.CurrentCustomerSession) { sessionDataValid = true; var cacheLastUpdatedAt = new Date(sessionData.UpdatedAt); var cacheMaxLastUpdatedAt = new Date(); cacheMaxLastUpdatedAt.setMinutes(cacheMaxLastUpdatedAt.getMinutes() - 5); // if the cache hasnt expired if (cacheLastUpdatedAt < cacheMaxLastUpdatedAt) { console.log("Cached session state has expired"); sessionDataValid = false; } // if we are using jwt we should check the session key if (jwtLogin) { if (!sessionData.JwtTokenCacheKey) { console.log("Cached session does not have a JwtTokenCacheKey"); sessionDataValid = false; } if (sessionData.JwtTokenCacheKey != jwtToken) { console.log("Cached session JwtTokenCacheKey does not match initlaized cache key"); sessionDataValid = false; } } } if (sessionDataValid) { console.log("Using cached value"); doCallback(callback, sessionData); return; } var ajaxOptions = { type: "GET", url: apiUrl + "/session/prescence/", data: options, success: function (data) { sessionUpdateReceived(data, true); doCallback(callback, data); } }; $.ajax(prepAjaxOptions(ajaxOptions)); }; var doLogin = function (options, callback) { if (jwtLogin) { console.log("doLogin is not supported for JWT authentication"); return; } var ajaxOptions = { type: "GET", url: apiUrl + "/session/start/", data: options, success: function (data) { if (Object.keys(data.ModelErrors).length === 0 && data.PageUrl === null) { sessionUpdateReceived(data, true); localStorage.setItem(loginCallbackName, callback); var search = window.location.search ? window.location.search + "&callbackurl=" + encodeURIComponent(window.location.href) : "?callbackurl=" + encodeURIComponent(window.location.href); var completePath = apiUrl + "/session/setcookie/" + data.AuthenticationToken + search; console.log('Commplete path:' + completePath); window.location.href = completePath; return; } doCallback(callback, data); } }; $.ajax(prepAjaxOptions(ajaxOptions)); }; var doLoginPost = function (options, callback) { if (jwtLogin) { console.log("doLogin is not supported for JWT authentication"); return; } function deserialize(serializedString) { serializedString = serializedString.replace(/\+/g, '%20'); var formFieldArray = serializedString.split("&"); var obj = {}; $.each(formFieldArray, function (i, pair) { var nameValue = pair.split("="); var name = decodeURIComponent(nameValue[0]); var value = decodeURIComponent(nameValue[1]); obj[name] = value; }); return obj; } var postData = deserialize(options); var ajaxOptions = { type: "POST", url: apiUrl + "/session/start/", contentType: "application/json; charset=utf-8", data: JSON.stringify(postData), success: function (data) { if (Object.keys(data.ModelErrors).length === 0) { sessionUpdateReceived(data, true); localStorage.setItem(loginCallbackName, callback); var search = window.location.search ? window.location.search + "&callbackurl=" + window.location.href : "?callbackurl=" + window.location.href; window.location.href = apiUrl + "/session/setcookie/" + data.AuthenticationToken + search; return; } doCallback(callback, data); } }; $.ajax(prepAjaxOptions(ajaxOptions)); }; var doLogout = function (options, callback) { var ajaxOptions = { type: "GET", url: apiUrl + "/session/terminate/", data: options, success: function (data) { cleanStatus(); doCallback(callback, data); } }; $.ajax(prepAjaxOptions(ajaxOptions)); }; var getKSession = function (options, callback) { var ajaxOptions = { type: "GET", url: apiUrl + "/session/ksession/", data: options, success: function (data) { if (data != null && data.ErrorMessage != null) { console.log(data.ErrorMessage); } doCallback(callback, data); } }; $.ajax(prepAjaxOptions(ajaxOptions)); }; var isEmailAddressValid = function (options, callback) { $.ajax({ url: apiUrl + "/user/isvalidemail/?lang=" + apiLanguage, type: "POST", data: JSON.stringify(options), contentType: "application/json; charset=utf-8", success: function (data) { doCallback(callback, data); }, error: function () { } }); }; var isEmailAddressRegistered = function (options, callback) { if (jwtLogin) { console.log("isEmailAddressRegistered is not supported for JWT authentication"); return; } $.ajax({ url: apiUrl + "/user/isregisteredemail/?lang=" + apiLanguage, type: "POST", data: JSON.stringify(options), contentType: "application/json; charset=utf-8", success: function (data) { doCallback(callback, data); }, error: function () { } }); }; var isVoucherCodeValid = function (options, callback) { $.ajax({ url: apiUrl + "/offervoucher/getstatusbycode/?lang=" + apiLanguage, type: "GET", data: options, success: function (data) { doCallback(callback, data); }, error: function () { } }); }; var doContactSubmission = function (options, callback) { var ajaxOptions = { type: "POST", contentType: "application/json", data: JSON.stringify(options), url: apiUrl + "/contact", success: function (data) { doCallback(callback, data); } }; $.ajax(prepAjaxOptions(ajaxOptions)); }; //*** Private functions ***// var doCallback = function (fn, data) { if (typeof fn === "function") { fn(data); return; } console.log("stream-payments - callback fn not set!"); }; var getCachedData = function (id) { var data = localStorage.getItem(id); if (!data) { return; } if (data.indexOf("function") === 0) { eval(data.replace("function", "var fn = function")); return fn; } return JSON.parse(data); }; var sessionUpdateReceived = function (data, store) { if (store) { data.UpdatedAt = new Date(); if (jwtLogin) { data.JwtTokenCacheKey = jwtToken; } localStorage.setItem(sessionDataName, JSON.stringify(data)); } }; var cleanStatus = function () { localStorage.removeItem(sessionDataName); }; var registerRedirectCleans = function () { $("a").click(function () { var url = $(this).attr("href"); if (url && url.indexOf("https://derbycountyfcpayments.streamamg.com/") !== -1) { cleanStatus(); } }); }; // Perpares the ajax request with CORS if supported or falls back to jsonp var prepAjaxOptions = function (ajaxOptions) { ajaxOptions.url = ajaxOptions.url + "?lang=" + apiLanguage; if (jwtLogin && jwtToken) { ajaxOptions.url = ajaxOptions.url + "&apijwttoken=" + jwtToken; } ajaxOptions.dataType = "jsonp"; if (hasCorsSupport()) { ajaxOptions.xhrFields = { withCredentials: true }; ajaxOptions.dataType = "json"; } return ajaxOptions; }; // Detects if the browser supports CORS var hasCorsSupport = function () { if ("withCredentials" in new XMLHttpRequest()) { return true; } else if (typeof XDomainRequest !== "undefined") { return true;; } else { return false; } }; var loadScript = function (url, cache) { var r = Math.floor((Math.random() * 100000000) + 1); var script = document.createElement("script"); script.src = !cache ? url + "?r=" + r : url; script.type = "text/javascript"; document.getElementsByTagName("head")[0].appendChild(script); }; var loadjQuery = function () { if (typeof $ === "undefined") { loadScript("https://derbycountyfcpayments.streamamg.com//Assets/Account/js/jquery.min.1.9.1.js", true); } }; //*** End of Private functions ***// return { init: init, getSubscriptionPackageList: getSubscriptionPackageList, getSessionState: getSessionState, doLogin: doLogin, doLoginPost: doLoginPost, doLogout: doLogout, doContactSubmission: doContactSubmission, isEmailAddressValid: isEmailAddressValid, isEmailAddressRegistered: isEmailAddressRegistered, isVoucherCodeValid: isVoucherCodeValid, getKSession: getKSession }; }());