PopupFreeTickit.cshtml 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. @using LotteryWebApp.Languages
  2. @using LotteryWebApp.Extensions
  3. @using Microsoft.AspNetCore.Http
  4. @using System.Globalization
  5. @{
  6. var shouldAutoCheckFreeTicket = Context.Session.GetString("Millions.FreeTicket.AutoChecked") != "1";
  7. var selectedWebsiteCulture = Context.Session.GetComplexData<string>("culture");
  8. var currentPopupCulture = string.IsNullOrWhiteSpace(selectedWebsiteCulture)
  9. ? System.Threading.Thread.CurrentThread.CurrentCulture.Name
  10. : selectedWebsiteCulture;
  11. var popupResourceCulture = currentPopupCulture.StartsWith("fr", StringComparison.OrdinalIgnoreCase)
  12. ? new CultureInfo("fr")
  13. : CultureInfo.InvariantCulture;
  14. string PopupText(string key) => Lang.ResourceManager.GetString(key, popupResourceCulture) ?? key;
  15. }
  16. <link rel="stylesheet" href="~/Millions/css/popup-free-ticket.css" asp-append-version="true" />
  17. <aside class="free-ticket-popup" aria-labelledby="freeTicketTitle">
  18. <a class="free-ticket-popup__card"
  19. href="#"
  20. id="freeTicketClaimButton"
  21. aria-label="Get your free ticket">
  22. <img class="free-ticket-popup__image"
  23. src="~/Millions/assets/images/free-ticket-floating-icon.png"
  24. alt="" aria-hidden="true" />
  25. <strong class="free-ticket-popup__ticket-text">
  26. @PopupText("millions_free")<br />@PopupText("millions_ticket")
  27. </strong>
  28. <strong class="free-ticket-popup__button-text" id="freeTicketTitle">
  29. @PopupText("millions_free") @PopupText("millions_ticket")
  30. </strong>
  31. </a>
  32. </aside>
  33. <div class="free-ticket-result" id="freeTicketResultModal" role="dialog" aria-modal="true"
  34. aria-labelledby="freeTicketResultTitle" aria-describedby="freeTicketResultDescription" hidden>
  35. <div class="free-ticket-result__backdrop" data-free-ticket-close></div>
  36. <section class="free-ticket-result__panel">
  37. <h2 class="free-ticket-visually-hidden" id="freeTicketResultTitle">@PopupText("free_ticket_waiting_title")</h2>
  38. <p class="free-ticket-visually-hidden" id="freeTicketResultDescription">@PopupText("free_ticket_waiting_description")</p>
  39. <img class="free-ticket-result__image"
  40. src="~/Millions/assets/images/free-ticket-success-no-text.png"
  41. alt="" aria-hidden="true" />
  42. <strong class="free-ticket-result__copy free-ticket-result__copy--badge">@PopupText("free_ticket_success_badge")</strong>
  43. <h2 class="free-ticket-result__copy free-ticket-result__copy--title">@PopupText("free_ticket_success_title")</h2>
  44. <p class="free-ticket-result__copy free-ticket-result__copy--received">@PopupText("free_ticket_success_received")</p>
  45. <p class="free-ticket-result__copy free-ticket-result__copy--ticket">@PopupText("free_ticket_success_ticket")</p>
  46. <p class="free-ticket-result__copy free-ticket-result__copy--chance">@PopupText("free_ticket_success_chance")</p>
  47. <strong class="free-ticket-result__copy free-ticket-result__copy--prize">30,000,000 HTG!</strong>
  48. <span class="free-ticket-result__copy free-ticket-result__copy--use">@PopupText("free_ticket_success_use")</span>
  49. <span class="free-ticket-result__copy free-ticket-result__copy--later">@PopupText("free_ticket_success_later")</span>
  50. <p class="free-ticket-result__copy free-ticket-result__copy--validity">@PopupText("free_ticket_success_validity")</p>
  51. <button type="button" class="free-ticket-result__action free-ticket-result__action--dismiss-icon"
  52. data-free-ticket-close aria-label="@PopupText("millions_close")"></button>
  53. <a class="free-ticket-result__action free-ticket-result__action--use"
  54. href="@Url.Action("BuyTicket", "Home", new { area = "Millions", freeTicketMode = "1" })"
  55. aria-label="@PopupText("free_ticket_buy_now")"></a>
  56. <button type="button" class="free-ticket-result__action free-ticket-result__action--later"
  57. data-free-ticket-close aria-label="@PopupText("millions_close")"></button>
  58. </section>
  59. </div>
  60. <div class="free-ticket-error-43" id="freeTicketError43Modal" role="dialog" aria-modal="true"
  61. aria-labelledby="freeTicketError43Title" aria-describedby="freeTicketError43Description" hidden>
  62. <div class="free-ticket-error-43__backdrop" data-free-ticket-error-43-close></div>
  63. <section class="free-ticket-error-43__panel">
  64. <h2 class="free-ticket-visually-hidden" id="freeTicketError43Title">@PopupText("free_ticket_error_43_title")</h2>
  65. <p class="free-ticket-visually-hidden" id="freeTicketError43Description">
  66. @PopupText("free_ticket_error_43_description")
  67. </p>
  68. <img class="free-ticket-error-43__image"
  69. src="~/Millions/assets/images/free-ticket-error-43-no-text.png"
  70. alt="" aria-hidden="true" />
  71. <strong class="free-ticket-error-43__copy free-ticket-error-43__copy--badge">@PopupText("free_ticket_error_43_badge")</strong>
  72. <h2 class="free-ticket-error-43__copy free-ticket-error-43__copy--title">@PopupText("free_ticket_error_43_title")</h2>
  73. <p class="free-ticket-error-43__copy free-ticket-error-43__copy--description">@PopupText("free_ticket_error_43_description")</p>
  74. <strong class="free-ticket-error-43__copy free-ticket-error-43__copy--daily-title">@PopupText("free_ticket_error_43_daily_title")</strong>
  75. <p class="free-ticket-error-43__copy free-ticket-error-43__copy--daily-description">@PopupText("free_ticket_error_43_daily_description")</p>
  76. <span class="free-ticket-error-43__copy free-ticket-error-43__copy--buy">@PopupText("millions_buy_ticket_label")</span>
  77. <span class="free-ticket-error-43__copy free-ticket-error-43__copy--close">@PopupText("millions_close")</span>
  78. <p class="free-ticket-error-43__copy free-ticket-error-43__copy--footer">@PopupText("free_ticket_error_43_footer")</p>
  79. <button type="button" class="free-ticket-error-43__action free-ticket-error-43__action--dismiss-icon"
  80. data-free-ticket-error-43-close aria-label="@PopupText("millions_close")"></button>
  81. <a class="free-ticket-error-43__action free-ticket-error-43__action--buy"
  82. href="@Url.Action("BuyTicket", "Home", new { area = "Millions" })"
  83. aria-label="@PopupText("millions_buy_ticket_label")"></a>
  84. <button type="button" class="free-ticket-error-43__action free-ticket-error-43__action--close"
  85. data-free-ticket-error-43-close aria-label="@PopupText("millions_close")"></button>
  86. </section>
  87. </div>
  88. <div class="free-ticket-error-44" id="freeTicketError44Modal" role="dialog" aria-modal="true"
  89. aria-labelledby="freeTicketError44Title" aria-describedby="freeTicketError44Description" hidden>
  90. <div class="free-ticket-error-44__backdrop" data-free-ticket-error-44-close></div>
  91. <section class="free-ticket-error-44__panel">
  92. <h2 class="free-ticket-visually-hidden" id="freeTicketError44Title">@PopupText("free_ticket_waiting_title")</h2>
  93. <p class="free-ticket-visually-hidden" id="freeTicketError44Description">
  94. @PopupText("free_ticket_waiting_description")
  95. </p>
  96. <img class="free-ticket-error-44__image"
  97. src="~/Millions/assets/images/free-ticket-error-44-no-text.png"
  98. alt="" aria-hidden="true" />
  99. <strong class="free-ticket-error-44__copy free-ticket-error-44__copy--badge">@PopupText("free_ticket_waiting_badge")</strong>
  100. <h2 class="free-ticket-error-44__copy free-ticket-error-44__copy--title">@PopupText("free_ticket_waiting_title")</h2>
  101. <p class="free-ticket-error-44__copy free-ticket-error-44__copy--description">@PopupText("free_ticket_waiting_description")</p>
  102. <p class="free-ticket-error-44__copy free-ticket-error-44__copy--chance">@PopupText("free_ticket_success_chance")</p>
  103. <strong class="free-ticket-error-44__copy free-ticket-error-44__copy--prize">30,000,000 HTG!</strong>
  104. <span class="free-ticket-error-44__copy free-ticket-error-44__copy--buy">@PopupText("free_ticket_buy_now")</span>
  105. <span class="free-ticket-error-44__copy free-ticket-error-44__copy--close">@PopupText("millions_close")</span>
  106. <p class="free-ticket-error-44__copy free-ticket-error-44__copy--footer">@PopupText("free_ticket_waiting_validity")</p>
  107. <button type="button" class="free-ticket-error-44__action free-ticket-error-44__action--dismiss-icon"
  108. data-free-ticket-error-44-close aria-label="@PopupText("millions_close")"></button>
  109. <a class="free-ticket-error-44__action free-ticket-error-44__action--buy"
  110. href="@Url.Action("BuyTicket", "Home", new { area = "Millions", freeTicketMode = "1" })"
  111. aria-label="@PopupText("free_ticket_buy_now")"></a>
  112. <button type="button" class="free-ticket-error-44__action free-ticket-error-44__action--close"
  113. data-free-ticket-error-44-close aria-label="@PopupText("millions_close")"></button>
  114. </section>
  115. </div>
  116. <div class="free-ticket-error-45" id="freeTicketError45Modal" role="dialog" aria-modal="true"
  117. aria-label="Free Tickets Are Sold Out" hidden>
  118. <div class="free-ticket-error-45__backdrop" data-free-ticket-error-45-close></div>
  119. <section class="free-ticket-error-45__panel">
  120. <img class="free-ticket-error-45__image"
  121. src="~/Millions/assets/images/free-ticket-error-45-no-text.png"
  122. alt="" aria-hidden="true" />
  123. <strong class="free-ticket-error-45__copy free-ticket-error-45__copy--ticket-free">@PopupText("free_ticket_error_45_ticket_free")</strong>
  124. <strong class="free-ticket-error-45__copy free-ticket-error-45__copy--ticket-tickets">@PopupText("free_ticket_error_45_ticket_tickets")</strong>
  125. <strong class="free-ticket-error-45__copy free-ticket-error-45__copy--ticket-sold-out">@PopupText("free_ticket_error_45_ticket_sold_out")</strong>
  126. <h2 class="free-ticket-error-45__copy free-ticket-error-45__copy--title">
  127. @PopupText("free_ticket_error_45_title") <span>@PopupText("free_ticket_error_45_title_emphasis")</span>
  128. </h2>
  129. <p class="free-ticket-error-45__copy free-ticket-error-45__copy--description">@PopupText("free_ticket_error_45_description")</p>
  130. <strong class="free-ticket-error-45__copy free-ticket-error-45__copy--next-title">@PopupText("free_ticket_error_45_next_title")</strong>
  131. <p class="free-ticket-error-45__copy free-ticket-error-45__copy--next-primary">@PopupText("free_ticket_error_45_next_primary")</p>
  132. <p class="free-ticket-error-45__copy free-ticket-error-45__copy--next-secondary">@PopupText("free_ticket_error_45_next_secondary")</p>
  133. <span class="free-ticket-error-45__copy free-ticket-error-45__copy--buy">@PopupText("millions_buy_ticket_label")</span>
  134. <span class="free-ticket-error-45__copy free-ticket-error-45__copy--close">@PopupText("millions_close")</span>
  135. <p class="free-ticket-error-45__copy free-ticket-error-45__copy--footer">@PopupText("free_ticket_error_45_footer")</p>
  136. <button type="button" class="free-ticket-error-45__action free-ticket-error-45__action--dismiss-icon"
  137. data-free-ticket-error-45-close aria-label="@PopupText("millions_close")"></button>
  138. <a class="free-ticket-error-45__action free-ticket-error-45__action--buy"
  139. href="@Url.Action("BuyTicket", "Home", new { area = "Millions" })"
  140. aria-label="@PopupText("millions_buy_ticket_label")"></a>
  141. <button type="button" class="free-ticket-error-45__action free-ticket-error-45__action--close"
  142. data-free-ticket-error-45-close aria-label="@PopupText("millions_close")"></button>
  143. </section>
  144. </div>
  145. <script>
  146. (function () {
  147. var popup = document.querySelector('.free-ticket-popup');
  148. var claimButton = document.getElementById('freeTicketClaimButton');
  149. var resultModal = document.getElementById('freeTicketResultModal');
  150. var error43Modal = document.getElementById('freeTicketError43Modal');
  151. var error44Modal = document.getElementById('freeTicketError44Modal');
  152. var error45Modal = document.getElementById('freeTicketError45Modal');
  153. var error43ReturnFocus = null;
  154. var error44ReturnFocus = null;
  155. var error45ReturnFocus = null;
  156. if (!popup) return;
  157. function showFreeTicketResult(result) {
  158. if (!resultModal || !result || String(result.responseCode) !== '0' || !result.code) {
  159. return false;
  160. }
  161. resultModal.hidden = false;
  162. document.body.classList.add('free-ticket-result-open');
  163. return true;
  164. }
  165. function showFreeTicketError43() {
  166. if (!error43Modal) return false;
  167. error43ReturnFocus = document.activeElement;
  168. error43Modal.hidden = false;
  169. document.body.classList.add('free-ticket-result-open');
  170. var closeButton = error43Modal.querySelector('[data-free-ticket-error-43-close]');
  171. if (closeButton) closeButton.focus();
  172. return true;
  173. }
  174. function closeFreeTicketError43() {
  175. if (!error43Modal) return;
  176. error43Modal.hidden = true;
  177. document.body.classList.remove('free-ticket-result-open');
  178. if (error43ReturnFocus && typeof error43ReturnFocus.focus === 'function') {
  179. error43ReturnFocus.focus();
  180. }
  181. }
  182. if (error43Modal) {
  183. error43Modal.querySelectorAll('[data-free-ticket-error-43-close]').forEach(function (closeButton) {
  184. closeButton.addEventListener('click', closeFreeTicketError43);
  185. });
  186. error43Modal.addEventListener('keydown', function (event) {
  187. if (event.key === 'Escape') closeFreeTicketError43();
  188. });
  189. }
  190. function showFreeTicketError44(result) {
  191. if (!error44Modal) return false;
  192. error44ReturnFocus = document.activeElement;
  193. error44Modal.hidden = false;
  194. document.body.classList.add('free-ticket-result-open');
  195. var closeButton = error44Modal.querySelector('[data-free-ticket-error-44-close]');
  196. if (closeButton) closeButton.focus();
  197. return true;
  198. }
  199. function closeFreeTicketError44() {
  200. if (!error44Modal) return;
  201. error44Modal.hidden = true;
  202. document.body.classList.remove('free-ticket-result-open');
  203. if (error44ReturnFocus && typeof error44ReturnFocus.focus === 'function') {
  204. error44ReturnFocus.focus();
  205. }
  206. }
  207. if (error44Modal) {
  208. error44Modal.querySelectorAll('[data-free-ticket-error-44-close]').forEach(function (closeButton) {
  209. closeButton.addEventListener('click', closeFreeTicketError44);
  210. });
  211. error44Modal.addEventListener('keydown', function (event) {
  212. if (event.key === 'Escape') closeFreeTicketError44();
  213. });
  214. }
  215. function showFreeTicketError45() {
  216. if (!error45Modal) return false;
  217. error45ReturnFocus = document.activeElement;
  218. error45Modal.hidden = false;
  219. document.body.classList.add('free-ticket-result-open');
  220. var closeButton = error45Modal.querySelector('[data-free-ticket-error-45-close]');
  221. if (closeButton) closeButton.focus();
  222. return true;
  223. }
  224. function closeFreeTicketError45() {
  225. if (!error45Modal) return;
  226. error45Modal.hidden = true;
  227. document.body.classList.remove('free-ticket-result-open');
  228. if (error45ReturnFocus && typeof error45ReturnFocus.focus === 'function') {
  229. error45ReturnFocus.focus();
  230. }
  231. }
  232. if (error45Modal) {
  233. error45Modal.querySelectorAll('[data-free-ticket-error-45-close]').forEach(function (closeButton) {
  234. closeButton.addEventListener('click', closeFreeTicketError45);
  235. });
  236. error45Modal.addEventListener('keydown', function (event) {
  237. if (event.key === 'Escape') closeFreeTicketError45();
  238. });
  239. }
  240. if (resultModal) {
  241. resultModal.querySelectorAll('[data-free-ticket-close]').forEach(function (closeButton) {
  242. closeButton.addEventListener('click', function () {
  243. resultModal.hidden = true;
  244. document.body.classList.remove('free-ticket-result-open');
  245. });
  246. });
  247. }
  248. if (claimButton) {
  249. var freeTicketMessages = {
  250. '38': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_38)),
  251. '39': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_39)),
  252. '40': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_40)),
  253. '41': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_41)),
  254. '42': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_42)),
  255. '43': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_43)),
  256. '44': @Html.Raw(System.Text.Json.JsonSerializer.Serialize(Lang.get_free_ticket_code_44))
  257. };
  258. if (@(shouldAutoCheckFreeTicket ? "true" : "false") && document.getElementById('playNowSection')) {
  259. document.addEventListener('DOMContentLoaded', function () {
  260. var initialVerificationToken = document.querySelector('input[name="__RequestVerificationToken"]');
  261. $.ajax({
  262. url: subDomain + '@Url.Action("GetFreeTicket", "Home", new { area = "Millions" })',
  263. type: 'POST',
  264. data: {
  265. __RequestVerificationToken: initialVerificationToken ? initialVerificationToken.value : '',
  266. type: '1'
  267. },
  268. success: function (result) {
  269. if (result && String(result.responseCode) === '0' && result.code) {
  270. showFreeTicketError44(result);
  271. }
  272. }
  273. });
  274. });
  275. }
  276. claimButton.addEventListener('click', function (event) {
  277. event.preventDefault();
  278. if (claimButton.dataset.loading === 'true') return;
  279. var verificationToken = document.querySelector('input[name="__RequestVerificationToken"]');
  280. claimButton.dataset.loading = 'true';
  281. claimButton.classList.add('free-ticket-popup__card--loading');
  282. $.ajax({
  283. url: subDomain + '@Url.Action("GetFreeTicket", "Home", new { area = "Millions" })',
  284. type: 'POST',
  285. data: {
  286. __RequestVerificationToken: verificationToken ? verificationToken.value : ''
  287. },
  288. success: function (result) {
  289. if (showFreeTicketResult(result)) {
  290. return;
  291. }
  292. var responseCode = result && result.responseCode
  293. ? String(result.responseCode)
  294. : '';
  295. if (responseCode === '43' && showFreeTicketError43()) {
  296. return;
  297. }
  298. if (responseCode === '44' && showFreeTicketError44(result)) {
  299. return;
  300. }
  301. if (responseCode === '45' && showFreeTicketError45()) {
  302. return;
  303. }
  304. var responseMessage = freeTicketMessages[responseCode]
  305. || (result && result.responseMessage)
  306. || 'Unable to get free ticket.';
  307. window.alert(responseMessage);
  308. },
  309. error: function () {
  310. window.alert('Unable to get free ticket.');
  311. },
  312. complete: function () {
  313. claimButton.dataset.loading = 'false';
  314. claimButton.classList.remove('free-ticket-popup__card--loading');
  315. }
  316. });
  317. });
  318. }
  319. function alignFreeTicketIcon() {
  320. var millionsFrame = document.querySelector('.main-content, .main-container');
  321. var playNowSection = document.getElementById('playNowSection');
  322. if (!millionsFrame) {
  323. popup.style.left = '';
  324. popup.style.right = '10px';
  325. return;
  326. }
  327. var frameRect = millionsFrame.getBoundingClientRect();
  328. var popupWidth = popup.getBoundingClientRect().width;
  329. popup.style.left = Math.max(8, frameRect.right - popupWidth - 15) + 'px';
  330. popup.style.right = 'auto';
  331. if (playNowSection) {
  332. var playRect = playNowSection.getBoundingClientRect();
  333. popup.style.top = (playRect.top - 7) + 'px';
  334. popup.style.bottom = 'auto';
  335. }
  336. }
  337. alignFreeTicketIcon();
  338. window.addEventListener('resize', alignFreeTicketIcon, { passive: true });
  339. window.addEventListener('scroll', alignFreeTicketIcon, { passive: true, capture: true });
  340. })();
  341. </script>