PageSourceSearch

https://www.3people.com.tw/Scripts/LITE.Cloud/Account/Login.js

js 3people.com.tw collected 2026-09-24 17:56:41 UTC 48,389 bytes, 1,354 lines download raw bytes

1/*登入相關功能*/
2
3//常用方法 Login.showLoginModal();
4
5//在console設成false, 則不實際發送簡訊, 用來測試程式
6var IsSMSSend = true;
7var Login = {
8    AjaxReady: false,//避免 Ajax 重複 POST}
9
10    ReturnUrl: "/",
11
12    //簡訊發送次數
13    SMSSendCount: 1,
14
15    //是否要經過活動註冊
16    isRegisterMemberEvent: false,
17
18    isRegisterMobileRequire: false,
19
20    isCongrationShow: false,
21
22    init: function (ReturnUrl) {
23        //初始化回 URL
24        Login.ReturnUrl = ReturnUrl;
25
26        //第三方 SDK 初始化
27        //子庭 2021/8/27 燈塔問題不預先載入等到需要觸發登入時在載入吧
28        //Facebook.initialFacebookSDK();
29        //Google.initialGoogleSDK();
30
31        //榜定快速登入與註冊的 AnchorClick 類別
32        Login.initAnchorClickEvent();
33
34        //快速註冊
35        Login.initialFastRegisterEvent();
36
37        //快速登入
38        Login.initialFastLoginEvent();
39
40        //FB登入
41        Login.initialFaceBookLoginEvent();
42
43        //一般註冊
44        Login.initialGeneralRegisterEvent();
45
46        //GP登入
47        Login.initialGoogleLoginEvent();
48
49        //活動註冊登入與註冊
50        Login.initialEventRegistLoginEvent();
51
52        Login.FancyEffectEvent();
53
54        //設定是否要會員註冊活動
55        Login.setIsRegisterMemberEvent();
56    },
57
58    initialUserInfo: function () {
59        if (typeof (window.memberId) == "undefined") {
60            CookieTool.CreateCookieInRoot("guestId", window.guestId, 30);
61        }
62    },
63
64    setReturnUrl: function (ReturnUrl) {
65        Login.ReturnUrl = ReturnUrl;
66
67        if ($("#SocialForm input[name=ReturnUrl]").length > 0) {
68            $("#SocialForm input[name=ReturnUrl]").val(ReturnUrl);
69        }
70    },
71
72    //延遲毫秒後 focusTextbox
73    DelayFocusInputText: function (selector) {
74        setTimeout(function () {
75            $(selector).focus();
76        }, 500);
77    },
78
79    //CR888 20150210
80    //給其他頁面用的 如果需要登入的行為 彈出Modal   Login.showLoginModal();
81    //子庭 2022/8/11 增加一個控制 顯示關閉(右上角叉叉,下方footer區塊)的按鈕區塊 的參數
82    showLoginModal: function (IsLogonFirst, IsShowCloseButton) {
83        var meLogin = this;
84
85        if ($('#fastLoginModal_V2').hasClass('in') == false) {
86            $('#fastLoginModal_V2').modal('show');
87        }
88
89        if (global.isNull(IsLogonFirst))
90            IsLogonFirst = true;
91        if (global.isNull(IsShowCloseButton))
92            IsShowCloseButton = true;
93
94        //顯示註冊/登入
95        if (IsLogonFirst) {
96            $('.FastReg').hide();
97            $('.FastLogon').show();
98            meLogin.DelayFocusInputText('#FastlogonForm #Account');
99            $('#login-form-link').click();
100        }
101        else {
102            $('.FastReg').show();
103            $('.FastLogon').hide();
104            meLogin.DelayFocusInputText('#FastRegisterForm #Name');
105            $('#register-form-link').click();
106        }
107        //顯示關閉(右上角叉叉,下方footer區塊)
108        if (IsShowCloseButton) {
109            $('#fastLoginModal_V2 .close').show();
110            $('#fastLoginModal_V2 .modal-footer').show();
111        }
112        else {
113            $('#fastLoginModal_V2 .close').hide();
114            $('#fastLoginModal_V2 .modal-footer').hide();
115        }
116    },
117
118    //初始化 A Tag 的 Click 事件綁定
119    initAnchorClickEvent: function () {
120        var meLogin = this;
121
122        //榜定 登入 行為的連結
123        //UNDONE 20160804 光男 團購需要因此改成live
124        //子庭 2021/8/27 案登入才載入fb和google插件
125        $(".LoginAnchorClick").on("click", function (e) {
126            e.preventDefault();
127            Facebook.initialFacebookSDK();
128            Google.initialGoogleSDK();
129            meLogin.showLoginModal(true);
130        });
131        //子庭 2021/8/27 案註冊才載入fb和google插件
132        //榜定 註冊 行為的連結
133        $(".RegistAnchorClick").click(function (e) {
134            e.preventDefault();
135            Facebook.initialFacebookSDK();
136            Google.initialGoogleSDK();
137            meLogin.showLoginModal(false);
138        });
139    },
140
141    validateCheck: function (event) {
142        var rules = {
143            //購買人相關
144            "Name": { required: true, minlength: 2, maxlength: 32 },
145            "MobilePhone": { required: Login.isRegisterMobileRequire.toLowerCase()=="true" , mobile: true },
146            "EMail": { required: true, email: true },
147            "RegisterAccount": { required: true, minlength: 6, maxlength: 32 },
148            "RegisterPassword": { required: true, minlength: 6, maxlength: 32 },
149            "ConfirmPassword": { required: true, minlength: 6, maxlength: 32 }
150        };
151
152        var messages = {
153            "Name": { required: "請填寫姓名" },
154            "MobilePhone": { required: "請填寫電話" },
155            "EMail": { required: "請填寫信箱" },
156            "RegisterAccount": { required: "請填帳號" },
157            "RegisterPassword": { required: "請填寫密碼" },
158            "ConfirmPassword": { required: "請填寫密碼" }
159        };
160
161        //驗證必填欄位以及格式
162        $(event.target).validate({
163            rules: rules,
164            messages: messages,
165            success: function (label) {
166                label.html("").removeClass("pic-wrong").addClass("note-pic checked");
167            },
168            highlight: function (element, errorClass) {
169                $(element).next().removeClass("checked").addClass("note-pic pic-wrong");
170            }
171        });
172
173        //驗證失敗,表單不送出
174        if (!$(event.target).valid()) {
175            isGONext = false;
176            if (event.preventDefault) {
177                event.preventDefault();
178            } else {
179            } //中止submit動作
180        } else {
181            event.preventDefault();
182            Login.ajaxSubmitFastRegister();
183            //mask.start();
184        }
185    },
186
187    //一些簡易特效
188    FancyEffectEvent: function () {
189        //切換頁籤特效
190        $("#messageBox").addClass("animated  bounceInLeft");
191    },
192
193    //初始化 改寫 Register submit
194    initialFastRegisterEvent: function () {
195        $("#FastRegisterForm").submit(function (e) {
196            Login.validateCheck(e);
197        });
198    },
199
200    //一般快速註冊
201    ajaxSubmitFastRegister: function () {
202        if (Login.AjaxReady == true) {
203            return false;
204        } else {
205            Login.AjaxReady = true;
206        }
207
208        var ajaxURL = WEBROOT + "/Account/FastRegisterPost";
209        var url = $("#freeRegisterUrl").val();
210
211        //$('#FastRegisterForm input[name=ReturnUrl]').val()
212        if ($("#FastRegisterForm input[name=ReturnUrl]").val() == '') {
213            $("#FastRegisterForm input[name=ReturnUrl]").val(url);
214        }
215
216        //將 hash 帶入 Returl
217        if (location.hash != "") {
218            var url = $("#FastRegisterForm input[name=ReturnUrl]").val();
219            var hash = location.hash;
220            $("#FastRegisterForm input[name=ReturnUrl]").val(url + hash);
221        }
222
223        //var RVT = "__RequestVerificationToken";
224        ////因為首頁是Catch,所以Razor的 @Html.AntiForgeryToken()不會更新,只能手動更新
225        //$.ajax({
226        //    url: WEBROOT + "/Common/GetAntiForgeryToken",
227        //    async: false,
228        //    success: function (json) {
229        //        //document.cookie = "__RequestVerificationToken=; expires=Thu, 01 Jan 1970 00:00:00 GMT";
230        //        //document.cookie = "__RequestVerificationToken=" + json.cookieToken;
231        //        if (CookieToolV2.hasItem(RVT)) {
232        //            CookieToolV2.removeItem(RVT, "/", DomainName);
233        //        }
234        //        CookieToolV2.setItem(RVT, json.cookieToken, null, "/", DomainName);
235        //        $('input[name=__RequestVerificationToken]').val(json.formToken);
236        //    }
237        //})
238
239        var data = $("#FastRegisterForm").serialize();
240
241        $.ajax({
242            url: ajaxURL,
243            data: data,
244            dataType: "json",
245            type: "POST",
246            beforeSend: function () {
247                mask.start();
248            },
249            success: function (response) {
250                Login.AjaxReady = false;
251                if (response.SuccessFul) {
252
253                    if (Login.isCongrationShow.toLowerCase() == "true") {
254                        //夏中傑 2020/6/4 流程變更,不顯示恭喜畫面
255                        //李永平 2021/6/29 改成顯示恭喜畫面
256                        bindLoginModalEvent.bindBeforeRedirect(response.ReturnUrl);
257                        Login.ajaxCongratulation();
258                    } else {
259                        //李永平 2021/2/23 改成僅彈出訊息
260                        alert("註冊成功");
261                        Login.LoginRedirect(response.ReturnUrl);
262                    }
263
264                }
265                else {
266                    mask.stop();
267                    alert(response.ErrorMessage);
268                    LoginCaptchaMVC.RefreshWithKey(response.key);
269                }
270            },
271            error: function (xhr, ajaxOptions, thrownError) {
272                //global.log(xhr);
273                mask.stop();
274            },
275            complete: function (xhr, textStatus) {
276                Login.AjaxReady = false;
277                mask.stop();
278            },
279        });
280        return false;
281    },
282
283    //===================================== 註冊後恭喜相關行為 ================================================
284    //呼叫恭喜頁面
285    ajaxCongratulation: function () {
286        if (Login.AjaxReady == true) {
287            return false;
288        } else {
289            Login.AjaxReady = true;
290        }
291
292        //mask.start();
293        $.ajax({
294            type: "GET",
295            url: WEBROOT + "/Account/Congratulation",
296            data: "",
297            dataType: "html",
298            beforeSend: function () {
299                mask.start();
300            },
301            success: function (response) {
302                Login.AjaxReady = false;
303                $('#CongratulationModalContent').html(response);
304                $('#CongratulationModal').modal('show');
305                setTimeout(function () {
306                    $('#MobilePhone').focus();
307                }, 500);
308                mask.stop();
309                CookieTool.CreateCookieInRoot("PromotionModalShow", true, 1);
310            },
311            error: function (xhr, ajaxOptions, thrownError) {
312                //global.log(xhr);
313                mask.stop();
314            },
315            complete: function (xhr, textStatus) {
316                Login.AjaxReady = false;
317                mask.stop();
318            },
319        });
320        mask.stop();
321        return false;
322    },
323    //手機驗證 181003 Yida
324    MobileVerifyCodeConfirm: function () {
325        var VerifyCode = parseInt($('.MobileVerifyCode').val());
326
327        if (!Number.isInteger(VerifyCode))
328            return alert('驗證碼格式需為數字');
329
330        var mobile = $('#MobilePhone').val().replace(/[^0-9\.]/g, '');
331        if (mobile.length < 10) return alert('手機號碼格式不正確');
332
333        mask.start('確認手機簡訊認證碼');
334        $.ajax({
335            url: WEBROOT + '/Member/Member/MobileVerify',
336            method: 'POST',
337            data: JSON.stringify({
338                VerifyCode: VerifyCode,
339                MemberID: '00000000-0000-0000-0000-000000000000',
340                Mobile: mobile
341            }),
342            contentType: 'application/json',
343            dataType: 'json',
344            success: function (resp) {
345                mask.stop();
346                if (resp.Successful) {
347                    Login.closeModal();
348                } else {
349                    console.error(resp.ErrorMessage);
350                    alert(resp.ErrorMessage);
351                }
352            },
353            error: function (jqXHR, textStatus) {
354                mask.stop();
355                console.error(jqXHR);
356                alert('手機認證失敗: 系統錯誤');
357            }
358        });
359    },
360
361    //寄驗證碼 181003 Yida
362    MobileVerifySMSSend: function () {
363        var mobile = $('#MobilePhone').val().replace(/[^0-9\.]/g, '');
364
365        if (mobile.length < 10) return alert('手機號碼格式不正確');
366
367        mask.start('發送手機簡訊');
368        $.ajax({
369            url: WEBROOT + "/Member/Member/MobileVerifySMSSend",
370            method: 'POST',
371            data: JSON.stringify({ Mobile: mobile, IsSMSSend: IsSMSSend, MemberID: '00000000-0000-0000-0000-000000000000' }),
372            contentType: 'application/json',
373            dataType: 'json',
374            success: function (resp) {
375                mask.stop();
376                //console.log(resp);
377                if (resp.Successful) {
378                    $('.MobileVerifySMSSendMsg').html('<span class="green">已發送(' + Login.SMSSendCount++ + ')</span>');
379                } else {
380                    console.error(resp.ErrorMessage);
381                    alert(resp.ErrorMessage);
382                }
383            },
384            error: function (jqXHR, textStatus) {
385                mask.stop();
386                console.error(jqXHR);
387                alert('寄手機認證簡訊失敗: 系統錯誤');
388            }
389        });
390    },
391
392    //送出恭喜頁面
393    CongratulationSubmit: function () {
394        //若沒填寫電話 直接再次執行免費觀看 >> 加入清單 >> 跳轉到清單頁
395        if ($('#MobilePhone').val().trim() == "") {
396            if ($('.js_FreeRegister').length) {
397                //bindLoginModalEvent.ExcutecallBackFunction();
398                event.preventDefault();
399            }
400        }
401        if (Login.AjaxReady == true) {
402            return false;
403        } else {
404            Login.AjaxReady = true;
405        }
406
407        $('#MobilePhone').val($('#MobilePhone').val().trim());
408        var data = $("#CongratulationForm").serialize();
409        $.ajax({
410            type: "POST",
411            url: WEBROOT + "/Account/Congratulation",
412            data: data,
413            dataType: "json",
414            beforeSend: function () {
415                mask.start();
416            },
417            success: function (response) {
418                Login.closeModal();
419            },
420            error: function (xhr, ajaxOptions, thrownError) {
421                Login.closeModal();
422            },
423            complete: function (xhr, textStatus) {
424                Login.AjaxReady = false;
425                Login.closeModal();
426            },
427        });
428        return false;
429    },
430    closeModal: function () {
431        $('#CongratulationModal').html("");
432        $('#CongratulationModal').modal('hide');
433        Login.AjaxReady = false;
434        bindLoginModalEvent.ExcutecallBackFunction();
435        mask.stop();
436    },
437    //====================================== 共用 登入事件 ======================================
438    //登入後的行為
439    LoginCallBack: function () {
440    },
441
442    //設定登入後行為
443    SetLoginCallBack: function (fn) {
444        //global.log("設定登入後行為");
445        Login.LoginCallBack = fn;
446        //global.log(Login.LoginCallBack);
447        //Login.LoginCallBack = fn;
448    },
449
450    //清除登入後的行為
451    ClearLoginCallBack: function (fn) {
452        //global.log("清除登入後的行為");
453        Login.LoginCallBack = function () {
454        };
455    },
456
457    //執行登入後行為
458    ExcuteLoginCallBack: function () {
459        //global.log("執行登入後行為");
460        Login.LoginCallBack();
461        Login.ClearLoginCallBack();
462    },
463
464    //登入後的跳轉判斷
465    LoginRedirect: function (url) {
466        //global.log("跳轉");
467        //判斷是否在一般登入頁面
468        if (url != undefined && url.indexOf("/Account/Login") > 0) {
469
470            url = "/會員專區";
471        }
472
473        //判斷是否有 hash 參數
474        //global.log(url);
475        //global.log(location.hash);
476        //global.log(url != undefined && url.indexOf('#') > 0);
477        if (url != undefined && url.indexOf('#') > 0) {
478
479            //global.log(".reload();");
480            window.location.reload();
481        } else {
482            //正常情況下 依照 Server 端回傳路徑跳轉
483            if (url) {
484                if (url.indexOf("http:") > 0 == false) {
485                    url = url.substring(0, 1) === "/" ? location.origin + url : location.origin + "/" + url;
486                }
487                //alert(url);
488                if (BrowserTool.isIE()) {
489                    window.location.href = url;
490                }
491                else {
492                    //location.replace(url);
493                    location.href = url;
494                }
495            }
496            else {
497                //global.log("reload(true)");
498                //其他非預期情況下 重新刷新頁面
499                window.location.reload(true);
500            }
501        }
502    },
503
504    //====================================== 一般註冊 ======================================
505    //初始化一般登入註冊事件綁定 (建立新帳戶)
506    initialGeneralRegisterEvent: function () {
507        //var url = BrowserTool.getLocationOrigin() + "/會員註冊";
508        var url = "/會員註冊";
509
510        if ($(".RegisterByGeneral").length > 0) {
511            $(".RegisterByGeneral").click(function (e) {
512                //Login.LoginRedirect(url); //原完整註冊流程
513                //子庭 2021/8/27 案註冊才載入fb和google插件
514                e.preventDefault();
515                Facebook.initialFacebookSDK();
516                Google.initialGoogleSDK();
517                Login.showLoginModal(false); //改燈箱快速註冊
518            });
519        }
520
521        if ($("#RegisterByGeneral").length > 0) {
522            $("#RegisterByGeneral").click(function (e) {
523                //Login.LoginRedirect(url); //原完整註冊流程
524                //子庭 2021/8/27 案註冊才載入fb和google插件
525                Facebook.initialFacebookSDK();
526                Google.initialGoogleSDK();
527                Login.showLoginModal(false); //改燈箱快速註冊
528            });
529        }
530    },
531    //====================================== 一般登入 ======================================
532    //初始化一般登入事件綁定
533    initialGeneralLoginEvent: function () {
534        if ($(".loginByGeneral").length > 0) {
535            $(".loginByGeneral").click(function (e) {
536                Login.GeneralLogin(Login.ReturnUrl);
537            });
538        }
539
540        if ($("#loginByGeneral").length > 0) {
541            $("#loginByGeneral").click(function (e) {
542                Login.GeneralLogin(Login.ReturnUrl);
543            });
544        }
545    },
546
547    //一般登入
548    GeneralLogin: function (ReturnUrl) {
549        $('#logonForm').validate();
550
551        if (!$('#logonForm').valid()) {
552            return false;
553        }
554
555        //global.log("一般登入");
556        if (Login.AjaxReady == true) {
557            return false;
558        } else {
559            Login.AjaxReady = true;
560        }
561
562        //寫入指定跳轉
563        if (ReturnUrl != "") {
564            $("#logonForm input[name=ReturnUrl]").val(ReturnUrl);
565        }
566
567        //將 hash 帶入 Returl
568        if (location.hash != "") {
569            //var url = $("#FastlogonForm input[name=ReturnUrl]").val();
570            $("#logonForm input[name=ReturnUrl]").val(ReturnUrl + hash);
571            ReturnUrl = ReturnUrl + hash;
572        }
573        var url = WEBROOT + "/Account/FastLogOn";
574        var data = $('#logonForm').serialize();
575        $.ajax({
576            type: "POST",
577            url: url,
578            data: data,
579            dataType: "json",
580            beforeSend: function () {
581                mask.start();
582            },
583            success: function (response) {
584                Login.AjaxReady = false;
585                if (response.SuccessFul == true) {
586                    //mask.start();
587                    if (ReturnUrl == "" || ReturnUrl == undefined) {
588                        Login.LoginRedirect(response.returnUrl);
589                    } else {
590                        Login.LoginRedirect(ReturnUrl);
591                    }
592                }
593                else {
594                    alert(response.ErrorMessage);
595                }
596            },
597            error: function (xhr, ajaxOptions, thrownError) {
598                Login.AjaxReady = false;
599            },
600            complete: function (xhr, textStatus) {
601                Login.AjaxReady = false;
602                mask.stop();
603            },
604        });
605        return false;
606    },
607
608    //====================================== 快速一般登入 ======================================
609    //初始化快速登入事件綁定
610    initialFastLoginEvent: function () {
611        if ($(".loginByFast").length > 0) {
612            $(".loginByFast").click(function (e) {
613                Login.FastLogin(Login.ReturnUrl);
614            });
615        }
616
617        if ($("#loginByFast").length > 0) {
618            $("#loginByFast").click(function (e) {
619                Login.FastLogin(Login.ReturnUrl);
620            });
621        }
622    },
623
624    //快速登入
625    FastLogin: function (ReturnUrl) {
626        if (!$('#FastlogonForm').valid()) {
627            return false;
628        }
629
630        //global.log("快速一般登入");
631        if (Login.AjaxReady == true) {
632            return false;
633        } else {
634            Login.AjaxReady = true;
635        }
636
637        //寫入指定跳轉
638        if (ReturnUrl != "") {
639            $("#FastlogonForm input[name=ReturnUrl]").val(ReturnUrl);
640        }
641
642        //將 hash 帶入 Returl
643        if (location.hash != "") {
644            //var url = $("#FastlogonForm input[name=ReturnUrl]").val();
645            var hash = location.hash;
646
647            $("#FastlogonForm input[name=ReturnUrl]").val(ReturnUrl + hash);
648            ReturnUrl = ReturnUrl + hash;
649
650        }
651        var url = WEBROOT + "/Account/FastLogOn";
652        var data = $('#FastlogonForm').serialize();
653        $.ajax({
654            type: "POST",
655            url: url,
656            data: data,
657            dataType: "json",
658            beforeSend: function () {
659                mask.start();
660            },
661            success: function (response) {
662                Login.AjaxReady = false;
663                if (response.SuccessFul == true) {
664                    Login.LoginRedirectChooser(ReturnUrl || response.returnUrl);
665                }
666                else {
667                    if (response.Result == 14) {
668                        //驗證是否為須註冊裝置狀態
669                        Login.setValidDeviceInterface();
670                    } else if (response.Result == 15) {
671                        //驗證是否超過註冊數量上限
672                        Login.setDeviceListInterface();
673                    } else {
674                        alert(response.ErrorMessage);
675                    }
676                }
677            },
678            error: function (xhr, ajaxOptions, thrownError) {
679                Login.AjaxReady = false;
680            },
681            complete: function (xhr, textStatus) {
682                Login.AjaxReady = false;
683                mask.stop();
684            },
685        });
686        return false;
687    },
688
689    //===================================== 社群相關共用 ================================================
690    //社群登入模式
691    LoginBySocial: function (access_token, ReturnUrl) {
692        //global.log("LoginBySocial");
693        //global.log(response);
694        if (Login.AjaxReady == true) {
695            return false;
696        } else {
697            Login.AjaxReady = true;
698        }
699
700        if ($("#SocialForm input[name=ReturnUrl]").val() == '') {
701            $("#SocialForm input[name=ReturnUrl]").val(ReturnUrl);
702        }
703
704        if ($("#fastLoginModal").length > 0) {
705            $("#fastLoginModal").modal('hide');
706        }
707
708        //確認表單存在
709        if ($('#SocialForm').length < 1) {
710            //global.log("已經登入");
711            //global.log("沒有社群表單");
712            return false;
713        }
714
715        //將 hash 帶入 Returl
716        if (location.hash != "" && ReturnUrl.indexOf('#') <= 0) {
717            var hash = location.hash;
718
719            $("#SocialForm #ReturnUrl").val(ReturnUrl + hash);
720            ReturnUrl = ReturnUrl + hash;
721
722        }
723        //global.log($("#SocialForm #ReturnUrl").val());
724
725        var sourceType = $("#SocialForm input[name='SourceType']").val();
726        var ajaxURL = WEBROOT + "/Account/LogOnByFacebookEmail/"; // 預設
727
728        switch (sourceType) {
729            case "7": // Facebook
730                ajaxURL = WEBROOT + "/Account/LogOnByFacebook/";
731                break;
732            case "8": // Google
733                ajaxURL = WEBROOT + "/Account/LogOnByGoogle/";
734                break;
735            default:
736                console.warn("未知的 SourceType,使用預設 /LogOnByFacebookEmail/");
737                break;
738        }
739        //var data = $('#SocialForm').serialize();
740
741        $.ajax({
742            url: ajaxURL,
743            data: {
744                accessToken: access_token,
745            },
746            type: "post",
747            beforeSend: function () {
748                mask.start();
749            },
750            success: function (response) {
751                mask.stop();
752                if (response.SuccessFul) {
753                    Login.AjaxReady = false;
754                    //已註冊愛上課會員
755                    //global.log("已註冊 開始登入");
756
757
758                    //永平 2021/6/29 登入後詢問使用者停留原畫面或是導向學員專區
759                    Login.LoginRedirectChooser(ReturnUrl || response.returnUrl);
760                    //if (ReturnUrl == "" || ReturnUrl == undefined) {
761                    //    Login.LoginRedirect(response.returnUrl);
762                    //} else {
763                    //    Login.LoginRedirect(ReturnUrl);
764                    //}
765                }
766                else {
767                    if (response.Result == 14) {
768                        //驗證是否為須註冊裝置狀態
769                        Login.setValidDeviceInterface();
770                    } else if (response.Result == 15) {
771                        //驗證是否超過註冊數量上限
772                        Login.setDeviceListInterface();
773                    }
774
775                    Login.AjaxReady = false;
776                    //自動幫註冊
777                    //global.log("未註冊 自動幫註冊");
778
779                    // 顯示伺服器返回的錯誤訊息
780                    if (response.Message) {
781                        alert("登入失敗:" + response.Message);
782                        return;
783                    }
784
785                    Login.ajaxSubmitSocialRegister();
786                }
787            },
788            error: function (xhr, ajaxOptions, thrownError) {
789                //global.log(xhr);
790                mask.stop();
791            },
792            complete: function (xhr, textStatus) {
793                Login.AjaxReady = false;
794                mask.stop();
795            },
796        });
797        return false;
798    },
799
800    LoginRedirectChooser: function (targetUrl) {
801        var normalizedTargetUrl = targetUrl;
802
803        // 若目標是首頁( / )或空值,前往會員專區按鈕改導向會員專區
804        if (!normalizedTargetUrl || normalizedTargetUrl === "/") {
805            normalizedTargetUrl = "/會員專區";
806        }
807
808        var finalTargetUrl = normalizedTargetUrl || Login.ReturnUrl || '/會員專區';
809
810        $("#fastLoginModal_V2").modal("hide");
811        $("#LoginRedirectModal").modal("show");
812        $("#StayHere").off("click").on("click", function () {
813            mask.start();
814            location.reload();
815        });
816        $("#GoToMember").off("click").on("click", function () {
817            mask.start();
818            Login.LoginRedirect(finalTargetUrl);
819        });
820    },
821
822    //社群註冊
823    ajaxSubmitSocialRegister: function () {
824        if (Login.AjaxReady == true) {
825            return false;
826        } else {
827            Login.AjaxReady = true;
828        }
829
830        //是否要經過活動註冊
831        if (Login.isRegisterMemberEvent) {
832            var postUrl = WEBROOT + "/Register/RegisterSocialStepOne";
833            $('body').append('<form action="' + postUrl + '" method="post" id="RegisterSocialForm">' + $("#SocialForm").html() + '</form>');
834            var form = $('#RegisterSocialForm');
835            form.submit();
836            return false;
837        }
838
839        var ajaxURL = WEBROOT + "/Account/FastRegisterPost";
840        var data = $("#SocialForm").serialize();
841
842        $.ajax({
843            url: ajaxURL,
844            data: data,
845            dataType: "json",
846            type: "post",
847            beforeSend: function () {
848                mask.start();
849            },
850            success: function (response) {
851                Login.AjaxReady = false;
852                if (response.SuccessFul) {
853                    $("#fastLoginModal").modal("hide");
854                    bindLoginModalEvent.bindBeforeRedirect(response.ReturnUrl);
855                    Login.ajaxCongratulation();
856                } else {
857                    mask.stop();
858                    alert(response.ErrorMessage);
859                }
860            },
861            error: function (xhr, ajaxOptions, thrownError) {
862                //global.log(xhr);
863                mask.stop();
864                Login.AjaxReady = false;
865            },
866            complete: function (xhr, textStatus) {
867                Login.AjaxReady = false;
868                mask.stop();
869            },
870        });
871        return false;
872    },
873
874    //設定社群資訊到表單
875    setSocialInfoToRegisterValue: function (response) {
876        //global.log("setSocialInfoToRegisterValue");
877        //global.log(response);
878        try {
879            $("#SocialForm input[name='SourceType']").val(response.sourcetype); //Google = 8
880            $("#SocialForm input[name='Account']").val(response.email);
881            $("#SocialForm input[name='Name']").val(response.name);
882            $("#SocialForm input[name='EMail']").val(response.email);
883            $("#SocialForm input[name='FacebookAccount']").val(response.email);
884            $("#SocialForm input[name='FacebookID']").val(response.id);
885            $("#SocialForm input[name='Birthday']").val(response.birthday);
886            $("#SocialForm input[name='AvatorImageUrl']").val(response.picture);
887            return true;
888        } catch (err) {
889            //global.log(err.message);
890            return false;
891        }
892    },
893
894    //回應類別物件
895    responseClass: (function () {
896        function responseClass() {
897        }
898        return responseClass;
899    })(),
900
901    //====================================== Google 登入使用 ======================================
902    //初始化 GOOGLE 登入行為事件
903    initialGoogleLoginEvent: function () {
904        if ($(".loginByGP").length > 0) {
905            $(".loginByGP").click(function () {
906                //子庭 2021/8/27 案下才載入google插件(確保載入)
907                Google.initialGoogleSDK();
908                Login.GPLogin(Login.ReturnUrl);
909            });
910        }
911
912        if ($("#loginByGP").length > 0) {
913            $("#loginByGP").click(function () {
914                //子庭 2021/8/27 案下才載入google插件(確保載入)
915                Google.initialGoogleSDK();
916                Login.GPLogin(Login.ReturnUrl);
917            });
918        }
919    },
920
921    //使用 Google 帳號登入
922    GPLogin: function (ReturnUrl) {
923        //global.log("GPLogin");
924        var clientId = Google.ClientID;
925        var apiKey = Google.ApiKey;
926        var scopes = "openid https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email ";
927
928        gapi.auth.authorize({ client_id: clientId, scope: scopes, immediate: true }, handleAuthResult);
929
930        function handleAuthResult(authResult) {
931            //登入狀態判斷
932            if (authResult && !authResult.error) {
933                var access_token = authResult.access_token;
934                //已登入
935                Login.GetAllGoogleInfo(function (response) {
936                    //global.log("開始登入");
937                    Login.LoginBySocial(access_token, ReturnUrl);
938                });
939            } else {
940                //嘗試在沒辦法自動登入時才做 登入視窗
941                if (authResult.error == "immediate_failed") {
942                    //未登入
943                    gapi.auth.authorize({ client_id: clientId, scope: scopes, immediate: false }, handleAuthResult);
944                }
945            }
946        }
947    },
948
949    //取得 Google 登入資訊
950    GetAllGoogleInfo: function (callBack) {
951        //global.log("GetAllGoogleInfo");
952        var response = new Login.responseClass();
953
954        gapi.client.load('oauth2', 'v2', function () {
955            var request = gapi.client.oauth2.userinfo.get();
956            request.execute(function (profile) {
957                if (profile) {
958                    //global.log("request.execute");
959                    response.sourcetype = 8;    //Google
960                    response.id = profile.id;
961                    response.name = profile.name;
962                    response.email = profile.email;
963                    response.link = profile.link;
964                    response.picture = profile.picture;
965                    response.successful = true;
966                    Login.setSocialInfoToRegisterValue(response);
967                    callBack(response);
968                }
969            });
970        });
971    },
972
973    //====================================== FaceBook 登入使用 ======================================
974    //初始化 FaceBook 登入行為事件
975    initialFaceBookLoginEvent: function () {
976        //global.log(Login.ReturnUrl);
977        if ($(".loginByFB").length > 0) {
978            $(".loginByFB").click(function () {
979                Login.FBLogin(Login.ReturnUrl);
980            });
981        }
982
983        //學員登入頁 用ID  我把它改成用 class
984        //if ($("#loginByFB").length > 0) {
985        //    $("#loginByFB").click(function () {
986        //        Login.FBLogin(Login.ReturnUrl);
987        //    });
988        //}
989
990        // 初始化 需要主動檢測FB登入的元素類別
991        Login.InitInitiativeFBLogin();
992    },
993
994    //使用 FaceBook 帳號登入
995    FBLogin: function (ReturnUrl) {
996        //global.log("FBLogin");
997        if (Login.AjaxReady == true) {
998            return false;
999        } else {
1000            Login.AjaxReady = true;
1001        }
1002
1003        //var Scope = 'publish_stream,email,user_birthday,user_mobile_phone,user_hometown,user_location,publish_actions';
1004        var Scope = 'email,public_profile,';
1005
1006        FB.login(function (response) {
1007            Login.AjaxReady = false;
1008            //先判斷是否已經登入了
1009
1010            if (response.authResponse) {
1011                access_token = response.authResponse.accessToken; //get access token
1012                user_id = response.authResponse.userID; //get FB UID
1013
1014                FB.api('/me', function (response) {
1015                    Login.GetAllFBInfo(function (response) {
1016                        //global.log("開始登入愛上課");
1017                        //console.log(response);
1018                        Login.LoginBySocial(access_token, ReturnUrl);
1019                    });
1020                });
1021            }
1022            //下面是沒有登入時才會做的,會去subscribe一個event,就是去監聽一個login event(也就是說login成功以後,會接收到訊息)
1023            else {
1024                //global.log("開始登入FB");
1025                FB.Event.subscribe('auth.login', function (response) {
1026                    if (response.authResponse) {
1027                        FB.api('/me', function (response) {
1028                            //global.log(response.email);
1029                        });
1030                    }
1031                });
1032            }
1033        }, { scope: Scope });
1034        return false;
1035    },
1036
1037    //$.cookie('the_cookie'); // 读取 cookie
1038    //$.cookie('the_cookie', 'the_value'); // 存储 cookie
1039    //$.cookie('the_cookie', 'the_value', { expires: 7 }); // 存储一个带7天期限的 cookie
1040
1041    initiativeFBLogin: false,
1042
1043    SetInitiativeFBLogin: function (bool) {
1044        Login.initiativeFBLogin = bool;
1045    },
1046
1047    InitiativeFBLogin: function () {
1048        if (CookieTool.GetCookie('initiativeFBLogin') !== null) {
1049            return;
1050        }
1051
1052        if (Login.initiativeFBLogin === false || CookieTool.GetCookie('initiativeFBLogin') === false) {
1053            return;
1054        }
1055        FB.getLoginStatus(function (response) {
1056
1057            if (response.status === 'connected' || response.status === 'not_authorized') {
1058
1059                //再檢查一次
1060                if (CookieTool.GetCookie('initiativeFBLogin') !== null) {
1061                    return;
1062                }
1063                if (Login.initiativeFBLogin === false || CookieTool.GetCookie('initiativeFBLogin') === false) {
1064                    return;
1065                }
1066                Login.initiativeFBLogin = false;
1067                CookieTool.CreateCookieInRoot('initiativeFBLogin', false, 30); //邵老師修改20150930
1068                Login.LoginByGlobalModal();
1069            }
1070        });
1071    },
1072
1073    InitInitiativeFBLogin: function () {
1074        Login.SetInitiativeFBLogin(true);
1075        var bindAction = function () {
1076            Login.InitiativeFBLogin();
1077        }
1078
1079        $('.LoginAnchorClick').bind("click", function () {
1080            bindAction();
1081        });
1082        $('.js_checkLoginBeforeAction').bind("click", function () {
1083            bindAction();
1084        });
1085        $('.moreInfo').bind("click", function () {
1086            bindAction();
1087        });
1088    },
1089
1090    LoginByGlobalModal: function () {
1091        if ($('#globalModal .loginByFB').length > 0) {
1092            $('#globalModal .loginByFB').remove();
1093        }
1094        $("#globalModal").bind("hidden", function () {
1095            $('.modal-dialog').css("width", null)
1096            $('#globalModal #globalModalTitle').text("")
1097            $('#globalModal #globalModalContent').text("")
1098            $('#globalModal .loginByFB').remove();
1099        });
1100
1101        $('#globalModal .modal-dialog').css("width", 480)
1102        $('#globalModal #globalModalTitle').text("訊息通知")
1103        $('#globalModal #globalModalContent').text("是否使用 Facebook 帳號登入?")
1104
1105        var btnYes = "<button type=\"button\" class=\"btn btn-small btn-success loginByFB\" data-dismiss=\"modal\">登入</button>";
1106
1107        $('#globalModal .modal-footer').prepend(btnYes);
1108        $('#globalModal .loginByFB').bind("click", function () {
1109            Login.FBLogin(Login.ReturnUrl);
1110        });
1111
1112        $("#globalModal").modal({
1113            "backdrop": "static",
1114            "keyboard": true,
1115            "show": true
1116        });
1117    },
1118    //取得 FaceBook 登入資訊
1119    GetAllFBInfo: function (callBack) {
1120        //global.log("GetAllFBleInfo");
1121        var response = new Login.responseClass();
1122
1123        FB.api('/me?fields=id,name,email,link', function (profile) {
1124            response.sourcetype = 7;    //FaceBook
1125            response.id = profile.id;
1126            response.name = profile.name;
1127            response.email = profile.email;
1128            response.link = profile.link;
1129            //子庭 2026/9/14 將 Facebook Graph API 固定為 v23.0,並使用 HTTPS
1130            response.picture = 'https://graph.facebook.com/v23.0/' + profile.id + '/picture';
1131            response.successful = true;
1132            Login.setSocialInfoToRegisterValue(response);
1133            callBack(response);
1134        });
1135    },
1136
1137    //====================================== 活動事件 登入與註冊 使用 ======================================
1138    //初始化 活動事件 登入與註冊 登入行為事件
1139    initialEventRegistLoginEvent: function () {
1140        if ($(".loginByEventRegist").length > 0) {
1141            $(".loginByEventRegist").click(function (e) {
1142                e.preventDefault();
1143                $("#EventRegistForm").validate();
1144                if ($("#EventRegistForm").valid()) {
1145                    location.hash = "login";
1146                    Login.EventRegistLogin(Login.ReturnUrl);
1147                }
1148                else {
1149                    //global.log("失敗");
1150                }
1151                return false;
1152            });
1153        }
1154
1155        if ($("#loginByEventRegist").length > 0) {
1156            $("#loginByEventRegist").click(function (e) {
1157                e.preventDefault();
1158                $("#EventRegistForm").validate();
1159                if ($("#EventRegistForm").valid()) {
1160                    location.hash = "login";
1161                    Login.EventRegistLogin(Login.ReturnUrl);
1162                }
1163                else {
1164                    //global.log("失敗");
1165                }
1166                return false;
1167            });
1168        }
1169    },
1170
1171    //活動註冊登入
1172    EventRegistLogin: function (ReturnUrl) {
1173        if (Login.AjaxReady == true) {
1174            return false;
1175        } else {
1176            Login.AjaxReady = true;
1177        }
1178
1179        //寫入指定跳轉
1180        if (ReturnUrl != "" && ReturnUrl != undefined) {
1181            //alert(ReturnUrl);
1182            $("#EventRegistForm input[name=ReturnUrl]").val(ReturnUrl);
1183        }
1184
1185        //將 hash 帶入 Returl
1186        if (location.hash != "") {
1187            var hash = location.hash;
1188            var s = $("#EventRegistForm input[name=ReturnUrl]").val();
1189            $("#EventRegistForm input[name=ReturnUrl]").val(s + hash);
1190            ReturnUrl = ReturnUrl + hash;
1191            //global.log($("#EventRegistForm input[name=ReturnUrl]").val());
1192        }
1193
1194        //var url = location.origin + "/Account/FastRegisterPost";
1195        var url = BrowserTool.getLocationOrigin() + "/Account/FastRegisterPost";
1196        var data = $('#EventRegistForm').serialize();
1197
1198        $.ajax({
1199            type: "POST",
1200            timeout: 15000,
1201            url: url,
1202            data: data,
1203            dataType: "json",
1204            beforeSend: function () {
1205                mask.start();
1206            },
1207            success: function (response) {
1208                Login.AjaxReady = false;
1209                if (response.SuccessFul == true) {
1210                    if (ReturnUrl == "" || ReturnUrl == undefined) {
1211                        //global.log(response.ReturnUrl);
1212                        Login.LoginRedirect(response.ReturnUrl);
1213                    } else {
1214                        //global.log(ReturnUrl);
1215                        Login.LoginRedirect(ReturnUrl);
1216                    }
1217                }
1218                else {
1219                    alert(response.ErrorMessage);
1220                }
1221            },
1222            error: function (xhr, ajaxOptions, thrownError) {
1223                Login.AjaxReady = false;
1224                mask.stop();
1225            },
1226            complete: function (XMLHttpRequest, status) {
1227                //請求完成後最終執行参數
1228                //global.log(status);
1229                if (status == 'timeout' || status == 'error') {
1230                    //超時, status 還有 success, error 等值的情況
1231                    //global.log(status == 'timeout');
1232                    setTimeout(function () {
1233                        mask.stop();
1234                        $('#AjaxErrorModal').modal('show');
1235                    }, 250);
1236                    return;
1237                }
1238
1239                mask.stop();
1240            }
1241        });
1242        return false;
1243    },
1244
1245    setIsRegisterMemberEvent: function () {
1246        //檢查是否 要經過活動註冊
1247        var IsRMEStr = $('#isRegisterMemberEvent').val();
1248        if (IsRMEStr.length > 0)
1249            Login.isRegisterMemberEvent = JSON.parse(IsRMEStr.toLowerCase())
1250    },
1251
1252    setDeviceListInterface: function () {
1253        var $logonpartial = $('.logonpartial');
1254
1255        $.ajax({
1256            type: "get",
1257            url: "/Account/DeviceList",
1258            dataType: "html",
1259            data: {},
1260            beforeSend: function () {
1261                mask.start();
1262            },
1263            success: function (response) {
1264                $logonpartial.html(response)
1265            },
1266            error: function (xhr, ajaxOptions, thrownError) {
1267                Login.AjaxReady = false;
1268                mask.stop();
1269            },
1270            complete: function (XMLHttpRequest, status) {
1271                //請求完成後最終執行参數
1272                //global.log(status);
1273                if (status == 'timeout' || status == 'error') {
1274                    //超時, status 還有 success, error 等值的情況
1275                    //global.log(status == 'timeout');
1276                    setTimeout(function () {
1277                        mask.stop();
1278                        $('#AjaxErrorModal').modal('show');
1279                    }, 250);
1280                    return;
1281                }
1282
1283                mask.stop();
1284            }
1285        });
1286    },
1287
1288    setValidDeviceInterface: function () {
1289        var $logonpartial = $('.logonpartial');
1290
1291        $.ajax({
1292            type: "get",
1293            url: "/Account/ValidDevice",
1294            dataType: "html",
1295            data: {},
1296            beforeSend: function () {
1297                mask.start();
1298            },
1299            success: function (response) {
1300                $logonpartial.html(response)
1301            },
1302            error: function (xhr, ajaxOptions, thrownError) {
1303                Login.AjaxReady = false;
1304                mask.stop();
1305            },
1306            complete: function (XMLHttpRequest, status) {
1307                //請求完成後最終執行参數
1308                //global.log(status);
1309                if (status == 'timeout' || status == 'error') {
1310                    //超時, status 還有 success, error 等值的情況
1311                    //global.log(status == 'timeout');
1312                    setTimeout(function () {
1313                        mask.stop();
1314                        $('#AjaxErrorModal').modal('show');
1315                    }, 250);
1316                    return;
1317                }
1318
1319                mask.stop();
1320            }
1321        });
1322    }
1323};
1324
1325//登出模組
1326var Logout =
1327{
1328    init: function () {
1329        Logout.initialLogoutEvent();
1330    },
1331
1332    initialLogoutEvent: function () {
1333        if ($(".logout").length > 0) {
1334            $(".logout").click(function (e) {
1335                //e.preventDefault();
1336                Logout.ClearCookie();
1337            });
1338        }
1339
1340        if ($("#logout").length > 0) {
1341            $("#logout").click(function (e) {
1342                //e.preventDefault();
1343                Logout.ClearCookie();
1344            });
1345        }
1346    },
1347
1348    ClearCookie: function () {
1349        CookieTool.DeleteCookieInRoot("EventEmail");
1350        CookieTool.DeleteCookieInRoot("EventMobilePhone");
1351        CookieTool.DeleteCookieInRoot("EventName");
1352        CookieTool.DeleteCookieInRoot("guestId");
1353    }
1354}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.