Advertisement
Guest User

Untitled

a guest
Apr 10th, 2017
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 24.99 KB | None | 0 0
  1. var _mify_rest = "/m/shop/id/"; //including last slash
  2. var _mify_debug = false;
  3. var _login_with_post = false;
  4. /*var bridgesocket = false; // This is used by ajax() function to determine if this is a call to BRIDGESOCKET.
  5.  
  6. // Replace the standard window.alert with one that handles BRIDGESOCKET errors.
  7. var default_alert = window.alert;
  8. window.alert = function(message) {
  9.  
  10. if (bridgesocket) {
  11. console.error("BRIDGESOCKET: " + message);
  12.  
  13. var i, j, k;
  14. // ...
  15. // j acquires some interesting value
  16. // Who called foo when j took this interesting value?
  17. //
  18.  
  19. var e = new Error('dummy');
  20. var stack = e.stack.replace(/^[^\(]+?[\n$]/gm, '')
  21. .replace(/^\s+at\s+/gm, '')
  22. .replace(/^Object.<anonymous>\s*\(/gm, '{anonymous}()@');
  23.  
  24. if (!stack.includes("setup.js")) {
  25. default_alert("BRIDGESOCKET does not appear to be installed.\n\nPlease follow the instructions on setup.html");
  26. }
  27. } else {
  28. default_alert(message);
  29. }
  30. };
  31. */
  32. var MIFY = function(loginResource, debug, loginWithPost) {
  33. //"use strict";
  34.  
  35. var USER_KEY = "MIFY_USER";
  36. var USER_TOKEN_KEY = "MIFY_U_TOKEN";
  37. var PWD_TOKEN_KEY = "MIFY_P_TOKEN";
  38. var LVS_INFO_KEY = "X-LVS-Information";
  39. var TOKEN_KEY = "X-LVS-HSToken";
  40. var LVS_MAC_ADDRESS_HEADER_KEY = "X-LVS-MacAddress";
  41. var SHOP_ACCOUNT_ID = "X-LVS-AccountID";
  42. var LANGUAGE_KEY = "MIFY_LANG";
  43. var LANGUAGE_HEADER_KEY = "Accept-Language";
  44.  
  45. var LINE_ID = Masagi.CountryConfig.get('lineId');
  46. var ORIGIN_ID = Masagi.CountryConfig.get('originId');
  47. var CURRENCY_ID = Masagi.CountryConfig.get('currency')['id'];
  48.  
  49. var loginHandler = null;
  50. var logoutHandler = null;
  51. var pendingRequest = null;
  52. var privateToken = null;
  53.  
  54. var messages = {
  55. provideValidUser2: "Please enter your username.",
  56. provideValidPass2: "Please enter your password.",
  57. provideValidUserPass: "Please enter your username and password.",
  58. validating: "Validating",
  59. UUIDNotFound: "Error retrieving your UUID. Please try logging in again.",
  60. loggedIn: "Logged in",
  61. serverNotResponding: "The server is not responding or is not reachable.",
  62. newPasswordMatch: "The new passwords must match.",
  63. registerTerminal: "To continue, please register this terminal.",
  64. login: "Log in"
  65. }
  66.  
  67. var setLanguage = function(languageisoCode) {
  68. localStorage.setItem(LANGUAGE_KEY, languageisoCode);
  69. };
  70.  
  71. var getLanguage = function() {
  72. var lang = localStorage.getItem(LANGUAGE_KEY);
  73.  
  74. // make sure that ringfence is in the correct locale
  75. if (typeof(java) !== "undefined") {
  76. try {
  77. java.setLocale(lang); // 'magic'
  78. } catch (e) {
  79. // statements to handle any exceptions
  80. console.log(e); // pass exception object to error handler
  81. }
  82. }
  83. return lang;
  84. };
  85.  
  86. var hideLogin = function() {
  87. if (document.getElementById("login_box") == undefined) return;
  88. document.getElementById("username").value = "";
  89. document.getElementById("password").value = "";
  90. document.getElementById("login_box").style.display = "none";
  91. };
  92.  
  93. //fill default username
  94. var lsUser = localStorage.getItem(USER_KEY);
  95. if (lsUser != undefined && lsUser != null) {
  96. var usernameBox = document.getElementById("username");
  97. if (usernameBox) {
  98. usernameBox.value = lsUser;
  99. }
  100. }
  101.  
  102. //assign login action
  103. var loginSubmitButton = document.getElementById("login-submit");
  104. if (loginSubmitButton) {
  105.  
  106. loginSubmitButton.onclick = function(e) {
  107.  
  108. var submitButton = this;
  109. if (submitButton.hasAttribute("disabled")) return;
  110.  
  111. var $username = document.getElementById("username");
  112. var $password = document.getElementById("password");
  113. var username = $username.value.trim();
  114. var password = $password.value.trim();
  115.  
  116.  
  117.  
  118. if (username === "" && password === "") {
  119. document.getElementById("login-msg").innerHTML = messages.provideValidUserPass;
  120. $username.focus();
  121. return false;
  122. } else if (username === "") {
  123. document.getElementById("login-msg").innerHTML = messages.provideValidUser2;
  124. $username.focus();
  125. return false;
  126. } else if (password === "") {
  127. document.getElementById("login-msg").innerHTML = messages.provideValidPass2;
  128. $password.focus();
  129. return false;
  130. }
  131.  
  132. submitButton.setAttribute("disabled", "disabled");
  133. submitButton.innerHTML = '<img src="img/loader.gif" />' + messages.validating;
  134.  
  135.  
  136.  
  137. var bridgesocket = /^https:\/\/bridgesocket.lvs.co.uk/.test(url);
  138.  
  139. var uuid;
  140.  
  141. if (bridgesocket === false) {
  142. uuid = BRIDGESOCKET.uuid(null, null);//MSW.bridgeSocketFound, MSW.noBridgeSocket);
  143. }
  144.  
  145. if (uuid === 'N/A') {
  146. displayLogin(messages.UUIDNotFound);
  147. return false;
  148. }
  149.  
  150. var method = "GET";
  151. var url = loginResource + username + "?password=" + password;
  152. var body = null;
  153.  
  154. if (loginWithPost) {
  155. method = "POST";
  156. url = loginResource + username;
  157. body = JSON.stringify({
  158. "password" : password,
  159. "lineId" : MIFY.LINE_ID,
  160. "originId" : MIFY.ORIGIN_ID
  161. });
  162. }
  163.  
  164. ajax(method, url, body, function(data, textStatus, xhr ) {
  165. localStorage.setItem(USER_KEY, username);
  166. localStorage.setItem(SHOP_ACCOUNT_ID, data['shop']['accountId']);
  167. localStorage.setItem("SHOP_DETAILS", JSON.stringify(data['shop']));
  168. localStorage.setItem("TILL_DETAILS", JSON.stringify(data['till']));
  169.  
  170. submitButton.innerHTML = '<img src="img/accept.png" />' + messages.loggedIn;
  171. document.getElementById("username").value = lsUser;
  172.  
  173. if (loginHandler != null) {
  174. loginHandler();
  175. }
  176. document.getElementById("login-msg").innerHTML = "";
  177. document.getElementById("login-loader").style.display = "block";
  178.  
  179. if (pendingRequest != null) {
  180. ajax(pendingRequest.method,
  181. pendingRequest.url,
  182. pendingRequest.data,
  183. pendingRequest.successCallback,
  184. pendingRequest.errorCallback,
  185. pendingRequest.additionalHeaders
  186. );
  187. pendingRequest = null;
  188. }
  189.  
  190. //Initialise the Other Transactions fields at login time.
  191. Masagi.Other.initFields();
  192. Masagi.Cashier.load();
  193.  
  194. }, function(xhr) {
  195. var response = {}
  196. try {
  197. var response = JSON.parse(xhr.response);
  198. }
  199. catch (e) {
  200. response = {
  201. 'errors' : [xhr.response]
  202. }
  203. }
  204.  
  205. console.log(response);
  206. console.log(response.errors);
  207.  
  208. var errors = response.errors || [];
  209. var loginErrorMsg = '';
  210.  
  211. // new format for 403 errors are response = {message:'error message'}
  212. if (xhr.status === 403 && errors.length === 0){
  213. errors.push(response);
  214. }
  215.  
  216. if (xhr.status == 0) {
  217. loginErrorMsg = messages.serverNotResponding;
  218. } else if (errors.length !== 0) {
  219. for (var i = errors.length - 1; i >= 0; i--) {
  220. if(errors[i].message) {
  221. loginErrorMsg += errors[i].message + '\n';
  222. }
  223. };
  224. } else {
  225. loginErrorMsg = (xhr.statusText != "")? xhr.responseText : xhr.response;
  226. }
  227.  
  228. displayLogin(loginErrorMsg);
  229.  
  230. }, null, true);
  231.  
  232. e.preventDefault();
  233.  
  234. return false;
  235. }
  236. }
  237.  
  238. var changePasswordOKButton = document.getElementById("change_password_ok");
  239. if (changePasswordOKButton) {
  240. changePasswordOKButton.onclick = function(e) {
  241. var oldPassword = document.getElementById("old_password").value;
  242. var newPassword1 = document.getElementById("new_password1").value;
  243. var newPassword2 = document.getElementById("new_password2").value;
  244. if (newPassword1 !== newPassword2) {
  245. MIFY.displayChangePassword(messages.newPasswordMatch);
  246. } else {
  247. var data = {
  248. oldPassword : oldPassword,
  249. password : newPassword1
  250. };
  251.  
  252. ajax("PUT", "/m/acc/pwd?token=" + localStorage.getItem(PWD_TOKEN_KEY), JSON.stringify(data), function(data, textStatus, xhr ) {
  253. document.getElementById("login-msg").innerHTML = "";
  254. document.getElementById("change_password_box").style.display = "none";
  255. console.log(data);
  256. }, function(xhr) {
  257. MIFY.displayChangePassword(xhr.response);
  258. console.error(xhr);
  259. }, null, true);
  260. }
  261.  
  262. e.preventDefault();
  263.  
  264. return false;
  265. }
  266. }
  267.  
  268. var changePasswordCancelButton = document.getElementById("change_password_cancel");
  269. if (changePasswordCancelButton) {
  270. changePasswordCancelButton.onclick = function(e) {
  271. document.getElementById("change_password_box").style.display = "none";
  272.  
  273. e.preventDefault();
  274.  
  275. return false;
  276. }
  277. }
  278.  
  279. var translateMessages = function(translations) {
  280. var locale = getLanguage().substr(0,2);
  281. if(locale !== 'en-GB' || locale !== 'dev') {
  282. for(prop in messages) {
  283. messages[prop] = translations[prop];
  284. }
  285. }
  286. };
  287.  
  288. var log = function(obj) {
  289. if (!debug) return;
  290. console.log(obj);
  291. };
  292.  
  293. var error = function(obj) {
  294. if (!debug) return;
  295. console.log(obj);
  296. };
  297.  
  298. var logout = function(reason) {
  299. localStorage.removeItem(USER_TOKEN_KEY);
  300. // BRIDGESOCKET.resetuuid();
  301. if (logoutHandler != null) {
  302. logoutHandler(reason);
  303. }
  304. pendingRequest = null;
  305. displayLogin(reason);
  306. };
  307.  
  308. var displayLogin = function(msg) {
  309.  
  310. var loginBoxElement = document.getElementById("login_box");
  311. var submitButton = document.getElementById("login-submit");
  312.  
  313.  
  314. if (submitButton) {
  315. submitButton.removeAttribute("disabled");
  316. submitButton.innerHTML = messages.login;
  317. }
  318. else {
  319. return false;
  320. } //exit function when in shop registration page (/setup2.html)
  321.  
  322. if(!msg && $(submitButton).is(':visible')){
  323. return false;
  324. }
  325.  
  326. document.getElementById("login-loader").style.display = "none";
  327. //fill default username
  328. var userbox = document.getElementById("username");
  329. var passbox = document.getElementById("password");
  330.  
  331. passbox.value = "";
  332. if (msg != undefined) {
  333.  
  334.  
  335. // console.log('--> (typeof msg)');
  336. // console.log((typeof msg));
  337. // if ((typeof msg) === "object") {
  338. // msg = msg.message;
  339. // }
  340.  
  341.  
  342. try{
  343. msg = JSON.parse(msg);
  344. msg = msg.message;
  345. }
  346. catch(e){
  347. //catch and just suppress error
  348. }
  349.  
  350. if (msg.toUpperCase().substr(0,3) === 'MAC') {
  351. alert (msg + "\n\n" + messages.registerTerminal);
  352. window.location.href='/setup2.html';
  353. } else {
  354. document.getElementById("login-msg").innerHTML = msg;
  355. }
  356. } else {
  357. var lsUser = localStorage.getItem(USER_KEY);
  358. if (lsUser != undefined && lsUser != null) {
  359. userbox.value = lsUser;
  360. passbox.focus();
  361. } else {
  362. userbox.value = "";
  363. userbox.focus();
  364. }
  365. }
  366.  
  367. loginBoxElement.style.display = "block";
  368.  
  369. };
  370.  
  371. var hasQueryString = function(url) {
  372. if(!url) return false
  373. var pattern = new RegExp(/.*?\?/);
  374. return pattern.test(url);
  375. }
  376.  
  377.  
  378. var isQueryStringInUrl = function(url, queryString) {
  379. if(url.indexOf('?'+queryString) > -1 || url.indexOf('&'+queryString) > -1) {
  380. return true;
  381. } else {
  382. return false;
  383. }
  384. }
  385.  
  386. var insertQueryStringInUrl = function(url, queryString, value) {
  387. if(hasQueryString(url)) {
  388. url = url + '&';
  389. } else {
  390. url = url + '?'
  391. }
  392. return url + queryString + '=' + value;
  393. }
  394.  
  395.  
  396. var displayChangePassword = function(msg) {
  397. var loginBoxElement = document.getElementById("change_password_box");
  398. var okButton = document.getElementById("change_password_ok");
  399. var cancelButtin = document.getElementById("change_password_cancel");
  400.  
  401. okButton.removeAttribute("disabled");
  402. document.getElementById("login-loader").style.display = "none";
  403.  
  404.  
  405. if (msg != undefined) {
  406. document.getElementById("change_password_msg").innerHTML = msg;
  407. } else {
  408. var old_password = document.getElementById("old_password").value = "";
  409. document.getElementById("new_password1").value = "";
  410. document.getElementById("new_password2").value = "";
  411. }
  412.  
  413. loginBoxElement.style.display = "block";
  414. }
  415.  
  416. var ajax = function(method, url, data, successCallback, errorCallback, additionalHeaders, skipToken) {
  417.  
  418. //inserts lineId to url if it does not have one yet
  419. if(method === 'GET' && !isQueryStringInUrl(url, 'lineId')) {
  420. url = insertQueryStringInUrl(url, 'lineId', LINE_ID);
  421. }
  422. if(method === 'GET' && !isQueryStringInUrl(url, 'originId')) {
  423. url = insertQueryStringInUrl(url, 'originId', ORIGIN_ID);
  424. }
  425.  
  426. if (typeof data === "function") {
  427. // The caller has not sent us a data parameter, so we shift everything along...
  428. errorCallback = successCallback;
  429. successCallback = data;
  430. data = null;
  431. }
  432. // To mimic how JQuery works, the signatures for success() and error() are as follows:
  433. // success( PlainObject data, String textStatus, jqXHR jqXHR )
  434. // error( jqXHR jqXHR, String textStatus, String errorThrown )
  435.  
  436. var start = new Date().getTime();
  437.  
  438. var token = null;
  439. if (privateToken) {
  440. token = privateToken;
  441. } else {
  442. token = localStorage.getItem(USER_TOKEN_KEY);
  443. }
  444.  
  445. if (token === null && skipToken === undefined) {
  446. pendingRequest = {
  447. method: method,
  448. url: url,
  449. data: data,
  450. successCallback: successCallback,
  451. errorCallback: errorCallback,
  452. additionalHeaders: additionalHeaders
  453. };
  454.  
  455. displayLogin();
  456.  
  457. if (errorCallback) {
  458. errorCallback(xhr, status, "Not logged in");
  459. } else {
  460. log("Call postponed as not logged in: " + method + " " + url);
  461. }
  462. return;
  463. }
  464.  
  465. var xhr = new XMLHttpRequest();
  466. if ("withCredentials" in xhr) {
  467. // XHR for Chrome/Firefox/Opera/Safari.
  468. xhr.open(method, url, true); // the 3rd parameter is Async
  469. } else if (typeof XDomainRequest != "undefined") {
  470. // XDomainRequest for IE.
  471. xhr = new XDomainRequest();
  472. xhr.open(method, url);
  473. } else {
  474. errorCallback(xhr, "error", "CORS is not suppported");
  475. return;
  476. }
  477.  
  478. xhr.timeout = 40000;
  479. xhr.setRequestHeader("Content-type", "application/json; charset=UTF-8");
  480.  
  481. if (token !== undefined && token) {//} && skipToken === undefined) {
  482. xhr.setRequestHeader(TOKEN_KEY, token);
  483. }
  484.  
  485. if (additionalHeaders != null && additionalHeaders != undefined) {
  486. for (var header in additionalHeaders) {
  487. xhr.setRequestHeader(header, additionalHeaders[header]);
  488. }
  489. }
  490.  
  491. var bridgesocket = /^https:\/\/bridgesocket.lvs.co.uk/.test(url);
  492. if (bridgesocket === false) {
  493. xhr.setRequestHeader(LVS_MAC_ADDRESS_HEADER_KEY, BRIDGESOCKET.uuid(null, null/*MSW.bridgeSocketFound, MSW.noBridgeSocket*/));
  494. }
  495.  
  496. var language = MIFY.getLanguage();
  497. if(language) {
  498. console.log(language);
  499. xhr.setRequestHeader(LANGUAGE_HEADER_KEY, language);
  500. }
  501.  
  502. xhr.onload = function(e) {
  503.  
  504. var responseReceived = new Date().getTime();
  505.  
  506. var token = xhr.getResponseHeader(TOKEN_KEY);
  507. if (token) {
  508. localStorage.setItem(USER_TOKEN_KEY, token);
  509. }
  510.  
  511. var rc = parseInt(xhr.status.toString()[0]); // Get the first character.
  512. if (rc >= 4) {
  513. error("-------------------");
  514. error(method + " " + url + "[" + (responseReceived - start) + "ms]");
  515. error(xhr);
  516.  
  517. var errorMsg = xhr.responseText;
  518. var info = xhr.getResponseHeader(LVS_INFO_KEY);
  519.  
  520. if (info != undefined && info != null && info != "") {
  521. errorMsg = info;
  522. }
  523.  
  524. error(errorMsg);
  525.  
  526. if (xhr.status === 401) {
  527. if (errorMsg === "Password expired.") {
  528. localStorage.removeItem(USER_TOKEN_KEY);
  529. localStorage.setItem(PWD_TOKEN_KEY, token);
  530. displayChangePassword(errorMsg);
  531. } else {
  532. logout(errorMsg);
  533. }
  534. } else {
  535. pendingRequest = {
  536. method: method,
  537. url: url,
  538. data: data,
  539. successCallback: successCallback,
  540. errorCallback: errorCallback,
  541. additionalHeaders: additionalHeaders
  542. };
  543. }
  544.  
  545. if (errorCallback) {
  546. errorCallback(xhr, "error", errorMsg);
  547. }
  548.  
  549. var responseHandled = new Date().getTime();
  550. error("Handled in " + (responseHandled - responseReceived) + "ms");
  551. error("-------------------\n");
  552.  
  553. } else {
  554. log("-------------------");
  555. log(method + " " + url + " [" + (responseReceived - start) + "ms]");
  556. log(xhr);
  557.  
  558. var responseText = "";
  559. if (xhr.responseText != undefined && xhr.responseText != "") {
  560. var type = xhr.getResponseHeader("Content-Type");
  561. if (type && type.indexOf("application/json") === 0) {
  562. responseText = JSON.parse(xhr.responseText);
  563. } else {
  564. responseText = xhr.response;
  565. }
  566. }
  567.  
  568. if (successCallback) {
  569. successCallback(responseText, xhr.status, xhr);
  570. }
  571.  
  572. var responseHandled = new Date().getTime();
  573. log("Handled in " + (responseHandled - responseReceived) + "ms");
  574. log("-------------------\n");
  575. }
  576. };
  577.  
  578. xhr.onerror = function(e) {
  579. var responseReceived = new Date().getTime();
  580.  
  581. error("-------------------");
  582. error(method + " " + url + " [" + (responseReceived - start) + "ms]");
  583. error(xhr);
  584.  
  585. var errorMsg = xhr.responseText;
  586. var info = xhr.getResponseHeader(LVS_INFO_KEY);
  587.  
  588. if (info != undefined && info != null && info != "") {
  589. errorMsg += "(" + info + ")";
  590. }
  591.  
  592. error(errorMsg);
  593.  
  594. if (xhr.status === 401) {
  595. logout(info);
  596. } else if (xhr.status === 0) {
  597. errorMsg = messages.serverNotResponding;
  598. }
  599.  
  600. if (errorCallback) {
  601. errorCallback(xhr, "error", errorMsg);
  602. }
  603.  
  604. var responseHandled = new Date().getTime();
  605. error("Handled in " + (responseHandled - responseReceived) + "ms");
  606. error("-------------------\n");
  607.  
  608. if (xhr.status !== 0) {
  609. logout(errorMsg);
  610. }
  611. };
  612.  
  613. xhr.ontimeout = function(e) {
  614. var responseReceived = new Date().getTime();
  615.  
  616. error("-------------------");
  617. error(method + " " + url + " [" + (responseReceived - start) + "ms]");
  618. error(xhr);
  619.  
  620. if (errorCallback) {
  621. errorCallback(xhr, "timeout", xhr.responseText);
  622. }
  623.  
  624. var responseHandled = new Date().getTime();
  625. error("Handled in " + (responseHandled - responseReceived) + "ms");
  626. error("-------------------\n");
  627.  
  628. };
  629.  
  630. if (data) {
  631. xhr.send(data);
  632. } else {
  633. xhr.send();
  634. }
  635. return xhr;
  636. };
  637.  
  638. return {
  639.  
  640. getLanguage: getLanguage,
  641.  
  642. setLanguage: setLanguage,
  643.  
  644. logout: logout,
  645.  
  646. displayLogin: displayLogin,
  647.  
  648. translateMessages: translateMessages,
  649.  
  650. displayChangePassword : function(msg) {
  651. displayChangePassword(msg);
  652. },
  653.  
  654. hideLogin: hideLogin,
  655.  
  656. isLoggedIn : function() {
  657. if (localStorage.getItem(USER_TOKEN_KEY)) {
  658. return true;
  659. } else {
  660. return false;
  661. };
  662. },
  663.  
  664. getShopId : function() {
  665. return localStorage.getItem(SHOP_ACCOUNT_ID);
  666. },
  667.  
  668. setLoginHandler : function(handler) {
  669. loginHandler = handler;
  670. },
  671.  
  672. setLogoutHandler : function(handler) {
  673. logoutHandler = handler;
  674. },
  675.  
  676. setPrivateToken : function(token) {
  677. privateToken = token;
  678. },
  679.  
  680. get : function(url, data, success, error, additionalHeaders) {
  681. return ajax('GET', url, data, success, error, additionalHeaders);
  682. },
  683.  
  684. get_no_token : function(url, data, success, error, additionalHeaders) {
  685. return ajax('GET', url, data, success, error, additionalHeaders, true);
  686. },
  687.  
  688. post : function(url, data, success, error, additionalHeaders) {
  689. return ajax('POST', url, data, success, error, additionalHeaders);
  690. },
  691.  
  692. post_no_token : function(url, data, success, error, additionalHeaders) {
  693. return ajax('POST', url, data, success, error, additionalHeaders, true);
  694. },
  695.  
  696. put : function(url, data, success, error, additionalHeaders) {
  697. return ajax('PUT', url, data, success, error, additionalHeaders);
  698. },
  699.  
  700. getToken : function(url) {
  701. return localStorage.getItem(USER_TOKEN_KEY);
  702. },
  703.  
  704. // delete is quoted as it's a keyword that is causing issue with the JS minifier
  705. "delete" : function(url, data, success, error, additionalHeaders) {
  706. return ajax('DELETE', url, data, success, error, additionalHeaders);
  707. }
  708. };
  709. }(_mify_rest, _mify_debug, _login_with_post);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement