PopupFreeTickit.cshtml 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. @using LotteryWebApp.Languages
  2. @using Microsoft.AspNetCore.Http
  3. @{
  4. var shouldAutoCheckFreeTicket = Context.Session.GetString("Millions.FreeTicket.AutoChecked") != "1";
  5. }
  6. <link rel="stylesheet" href="~/Millions/css/popup-free-ticket.css" asp-append-version="true" />
  7. <aside class="free-ticket-popup" aria-labelledby="freeTicketTitle">
  8. <a class="free-ticket-popup__card"
  9. href="#"
  10. id="freeTicketClaimButton"
  11. aria-label="Get your free ticket">
  12. <img class="free-ticket-popup__image"
  13. src="~/Millions/assets/images/free-ticket-floating-icon.png"
  14. alt="" aria-hidden="true" />
  15. <strong class="free-ticket-popup__ticket-text">
  16. @Lang.millions_free<br />@Lang.millions_ticket
  17. </strong>
  18. <strong class="free-ticket-popup__button-text" id="freeTicketTitle">
  19. @Lang.millions_free @Lang.millions_ticket
  20. </strong>
  21. </a>
  22. </aside>
  23. <div class="free-ticket-result" id="freeTicketResultModal" role="dialog" aria-modal="true"
  24. aria-labelledby="freeTicketResultTitle" aria-describedby="freeTicketResultDescription" hidden>
  25. <div class="free-ticket-result__backdrop" data-free-ticket-close></div>
  26. <section class="free-ticket-result__panel">
  27. <h2 class="free-ticket-visually-hidden" id="freeTicketResultTitle">@Lang.free_ticket_waiting_title</h2>
  28. <p class="free-ticket-visually-hidden" id="freeTicketResultDescription">@Lang.free_ticket_waiting_description</p>
  29. <img class="free-ticket-result__image"
  30. src="~/Millions/assets/images/free-ticket-success.png"
  31. alt="" aria-hidden="true" />
  32. <button type="button" class="free-ticket-result__action free-ticket-result__action--dismiss-icon"
  33. data-free-ticket-close aria-label="@Lang.millions_close"></button>
  34. <a class="free-ticket-result__action free-ticket-result__action--use"
  35. href="@Url.Action("BuyTicket", "Home", new { area = "Millions", freeTicketMode = "1" })"
  36. aria-label="@Lang.free_ticket_buy_now"></a>
  37. <button type="button" class="free-ticket-result__action free-ticket-result__action--later"
  38. data-free-ticket-close aria-label="@Lang.millions_close"></button>
  39. </section>
  40. </div>
  41. <div class="free-ticket-error-43" id="freeTicketError43Modal" role="dialog" aria-modal="true"
  42. aria-labelledby="freeTicketError43Title" aria-describedby="freeTicketError43Description" hidden>
  43. <div class="free-ticket-error-43__backdrop" data-free-ticket-error-43-close></div>
  44. <section class="free-ticket-error-43__panel">
  45. <h2 class="free-ticket-visually-hidden" id="freeTicketError43Title">@Lang.free_ticket_error_43_title</h2>
  46. <p class="free-ticket-visually-hidden" id="freeTicketError43Description">
  47. @Lang.free_ticket_error_43_description
  48. </p>
  49. <img class="free-ticket-error-43__image"
  50. src="~/Millions/assets/images/free-ticket-error-43.png"
  51. alt="" aria-hidden="true" />
  52. <button type="button" class="free-ticket-error-43__action free-ticket-error-43__action--dismiss-icon"
  53. data-free-ticket-error-43-close aria-label="@Lang.millions_close"></button>
  54. <a class="free-ticket-error-43__action free-ticket-error-43__action--buy"
  55. href="@Url.Action("BuyTicket", "Home", new { area = "Millions" })"
  56. aria-label="@Lang.millions_buy_ticket_label"></a>
  57. <button type="button" class="free-ticket-error-43__action free-ticket-error-43__action--close"
  58. data-free-ticket-error-43-close aria-label="@Lang.millions_close"></button>
  59. </section>
  60. </div>
  61. <div class="free-ticket-error-44" id="freeTicketError44Modal" role="dialog" aria-modal="true"
  62. aria-labelledby="freeTicketError44Title" aria-describedby="freeTicketError44Description" hidden>
  63. <div class="free-ticket-error-44__backdrop" data-free-ticket-error-44-close></div>
  64. <section class="free-ticket-error-44__panel">
  65. <h2 class="free-ticket-visually-hidden" id="freeTicketError44Title">@Lang.free_ticket_waiting_title</h2>
  66. <p class="free-ticket-visually-hidden" id="freeTicketError44Description">
  67. @Lang.free_ticket_waiting_description
  68. </p>
  69. <img class="free-ticket-error-44__image"
  70. src="~/Millions/assets/images/free-ticket-error-44.png"
  71. alt="" aria-hidden="true" />
  72. <button type="button" class="free-ticket-error-44__action free-ticket-error-44__action--dismiss-icon"
  73. data-free-ticket-error-44-close aria-label="@Lang.millions_close"></button>
  74. <a class="free-ticket-error-44__action free-ticket-error-44__action--buy"
  75. href="@Url.Action("BuyTicket", "Home", new { area = "Millions", freeTicketMode = "1" })"
  76. aria-label="@Lang.free_ticket_buy_now"></a>
  77. <button type="button" class="free-ticket-error-44__action free-ticket-error-44__action--close"
  78. data-free-ticket-error-44-close aria-label="@Lang.millions_close"></button>
  79. </section>
  80. </div>
  81. <script>
  82. (function () {
  83. var popup = document.querySelector('.free-ticket-popup');
  84. var claimButton = document.getElementById('freeTicketClaimButton');
  85. var resultModal = document.getElementById('freeTicketResultModal');
  86. var error43Modal = document.getElementById('freeTicketError43Modal');
  87. var error44Modal = document.getElementById('freeTicketError44Modal');
  88. var error43ReturnFocus = null;
  89. var error44ReturnFocus = null;
  90. if (!popup) return;
  91. function showFreeTicketResult(result) {
  92. if (!resultModal || !result || String(result.responseCode) !== '0' || !result.code) {
  93. return false;
  94. }
  95. resultModal.hidden = false;
  96. document.body.classList.add('free-ticket-result-open');
  97. return true;
  98. }
  99. function showFreeTicketError43() {
  100. if (!error43Modal) return false;
  101. error43ReturnFocus = document.activeElement;
  102. error43Modal.hidden = false;
  103. document.body.classList.add('free-ticket-result-open');
  104. var closeButton = error43Modal.querySelector('[data-free-ticket-error-43-close]');
  105. if (closeButton) closeButton.focus();
  106. return true;
  107. }
  108. function closeFreeTicketError43() {
  109. if (!error43Modal) return;
  110. error43Modal.hidden = true;
  111. document.body.classList.remove('free-ticket-result-open');
  112. if (error43ReturnFocus && typeof error43ReturnFocus.focus === 'function') {
  113. error43ReturnFocus.focus();
  114. }
  115. }
  116. if (error43Modal) {
  117. error43Modal.querySelectorAll('[data-free-ticket-error-43-close]').forEach(function (closeButton) {
  118. closeButton.addEventListener('click', closeFreeTicketError43);
  119. });
  120. error43Modal.addEventListener('keydown', function (event) {
  121. if (event.key === 'Escape') closeFreeTicketError43();
  122. });
  123. }
  124. function showFreeTicketError44(result) {
  125. if (!error44Modal) return false;
  126. error44ReturnFocus = document.activeElement;
  127. error44Modal.hidden = false;
  128. document.body.classList.add('free-ticket-result-open');
  129. var closeButton = error44Modal.querySelector('[data-free-ticket-error-44-close]');
  130. if (closeButton) closeButton.focus();
  131. return true;
  132. }
  133. function closeFreeTicketError44() {
  134. if (!error44Modal) return;
  135. error44Modal.hidden = true;
  136. document.body.classList.remove('free-ticket-result-open');
  137. if (error44ReturnFocus && typeof error44ReturnFocus.focus === 'function') {
  138. error44ReturnFocus.focus();
  139. }
  140. }
  141. if (error44Modal) {
  142. error44Modal.querySelectorAll('[data-free-ticket-error-44-close]').forEach(function (closeButton) {
  143. closeButton.addEventListener('click', closeFreeTicketError44);
  144. });
  145. error44Modal.addEventListener('keydown', function (event) {
  146. if (event.key === 'Escape') closeFreeTicketError44();
  147. });
  148. }
  149. if (resultModal) {
  150. resultModal.querySelectorAll('[data-free-ticket-close]').forEach(function (closeButton) {
  151. closeButton.addEventListener('click', function () {
  152. resultModal.hidden = true;
  153. document.body.classList.remove('free-ticket-result-open');
  154. });
  155. });
  156. }
  157. if (claimButton) {
  158. var freeTicketMessages = {
  159. '38': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_38)),
  160. '39': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_39)),
  161. '40': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_40)),
  162. '41': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_41)),
  163. '42': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_42)),
  164. '43': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_43)),
  165. '44': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_44))
  166. };
  167. if (@(shouldAutoCheckFreeTicket ? "true" : "false") && document.getElementById('playNowSection')) {
  168. document.addEventListener('DOMContentLoaded', function () {
  169. var initialVerificationToken = document.querySelector('input[name="__RequestVerificationToken"]');
  170. $.ajax({
  171. url: subDomain + '@Url.Action("GetFreeTicket", "Home", new { area = "Millions" })',
  172. type: 'POST',
  173. data: {
  174. __RequestVerificationToken: initialVerificationToken ? initialVerificationToken.value : '',
  175. type: '1'
  176. },
  177. success: function (result) {
  178. if (result && String(result.responseCode) === '0' && result.code) {
  179. showFreeTicketError44(result);
  180. }
  181. }
  182. });
  183. });
  184. }
  185. claimButton.addEventListener('click', function (event) {
  186. event.preventDefault();
  187. if (claimButton.dataset.loading === 'true') return;
  188. var verificationToken = document.querySelector('input[name="__RequestVerificationToken"]');
  189. claimButton.dataset.loading = 'true';
  190. claimButton.classList.add('free-ticket-popup__card--loading');
  191. $.ajax({
  192. url: subDomain + '@Url.Action("GetFreeTicket", "Home", new { area = "Millions" })',
  193. type: 'POST',
  194. data: {
  195. __RequestVerificationToken: verificationToken ? verificationToken.value : ''
  196. },
  197. success: function (result) {
  198. if (showFreeTicketResult(result)) {
  199. return;
  200. }
  201. var responseCode = result && result.responseCode
  202. ? String(result.responseCode)
  203. : '';
  204. if (responseCode === '43' && showFreeTicketError43()) {
  205. return;
  206. }
  207. if (responseCode === '44' && showFreeTicketError44(result)) {
  208. return;
  209. }
  210. var responseMessage = freeTicketMessages[responseCode]
  211. || (result && result.responseMessage)
  212. || 'Unable to get free ticket.';
  213. window.alert(responseMessage);
  214. },
  215. error: function () {
  216. window.alert('Unable to get free ticket.');
  217. },
  218. complete: function () {
  219. claimButton.dataset.loading = 'false';
  220. claimButton.classList.remove('free-ticket-popup__card--loading');
  221. }
  222. });
  223. });
  224. }
  225. function alignFreeTicketIcon() {
  226. var millionsFrame = document.querySelector('.main-content, .main-container');
  227. var playNowSection = document.getElementById('playNowSection');
  228. if (!millionsFrame) {
  229. popup.style.left = '';
  230. popup.style.right = '10px';
  231. return;
  232. }
  233. var frameRect = millionsFrame.getBoundingClientRect();
  234. var popupWidth = popup.getBoundingClientRect().width;
  235. popup.style.left = Math.max(8, frameRect.right - popupWidth - 15) + 'px';
  236. popup.style.right = 'auto';
  237. if (playNowSection) {
  238. var playRect = playNowSection.getBoundingClientRect();
  239. popup.style.top = (playRect.top - 7) + 'px';
  240. popup.style.bottom = 'auto';
  241. }
  242. }
  243. alignFreeTicketIcon();
  244. window.addEventListener('resize', alignFreeTicketIcon, { passive: true });
  245. window.addEventListener('scroll', alignFreeTicketIcon, { passive: true, capture: true });
  246. })();
  247. </script>