$(function () {
    'use strict';

    var debug = false;

    var id = ko.observable(''),
        password = ko.observable(''),
        checkSaveId = ko.observable(false),
        disabledLoginButton = ko.observable(false),
        disabledIdTextBox = ko.observable(false),
        disabledPasswordTextBox = ko.observable(false),
        disabledCheckSaveId = ko.observable(false)
    ;

    var overlayOptions = {
        width: '100%',
        height: '100%',
        visible: ko.observable(false),
        animation: null,
        shading: true,
        showingAction: function () {
            BWA.UserPanel.hide();
        },

        contentReadyAction: function (e) {
            BWA.CenterLoginOverlay.handleCheckSaveId();
        }
    };

    function handleLoginFail(error) {
        utils.toast.show('로그인에 실패하였습니다.', 'error');
    }

    function handleAfterTryLogin() {
        disabledLoginButton(false);
        disabledIdTextBox(false);
        disabledPasswordTextBox(false);
        disabledCheckSaveId(false);
        BWA.LoadIndicator.promiseAlways();
    }

    BWA.CenterLoginOverlay = {
        handleCheckSaveId: function() {
            $('.intro_login_container').parent().parent().css('z-index', 3000);

        checkSaveId($.cookie('checkCenterSaveId') == "true" ? true : false);

        if (checkSaveId()) {
            var cookieId = $.cookie('centerId');
            id(cookieId);
        }
        else {
            var cookieId = "";
            id(cookieId);
        }

        if (debug) {
            id('center');
            password('center');
        }
        },
        overlayOptions: overlayOptions,
        getIdTextBoxOptions: function () {
            return {
                value: id,
                disabled: disabledIdTextBox,
                placeholder: ' username', //placeholder: $G('id'), 

                onKeyPress: function (e) {
                    if (e.jQueryEvent.charCode == 13)
                        BWA.CenterLoginOverlay.handleLoginButton();
                }
            };
        },

        getPasswordTextBoxOptions: function () {
            return {
                value: password,
                disabled: disabledPasswordTextBox,
                mode: 'password',
                placeholder: ' password',//placeholder: $G('password'),                
                onKeyPress: function (e) {
                    if (e.jQueryEvent.charCode == 13) {
                        $('#loginbtn').focus();
                        BWA.CenterLoginOverlay.handleLoginButton();
                    }
                }
            };
        },

        getCheckBoxOptions: function () {
            return {
                value: checkSaveId,
                disabled: disabledCheckSaveId
            };
        },

        getButtonOptions: function () {
            return {
                disabled: disabledLoginButton,
                clickAction: BWA.CenterLoginOverlay.handleLoginButton
            };
        },

        GetClientIP: function () {
           
            var dfd = $.Deferred();
            var urlHeader = BemsWebApplication.config.endpoints.api[BemsWebApplication.config.mode];            
            $.get(urlHeader+"/ClientAccess/ClientIpAddress", function (response) {
                if (response.ip === '::1') {
                    response.ip = '127.0.0.1';
                }
                return dfd.resolve(true, response.ip);
            });
            return dfd.promise();
        },

        handleLogoutButton: function () {

            // 로그아웃 히스토리 기록 
            var loginHistoryModel = new BemsWebApplication.CmUserLoginHistoryViewModel();
            loginHistoryModel.SiteId = BWA.UserInfo.SiteId;
            loginHistoryModel.UserId = BWA.UserInfo.UserId;
            loginHistoryModel.Type('Log-Off');
            loginHistoryModel.TraceTime(new Date());

            $.when(BWA.CenterLoginOverlay.GetClientIP()).done(function (result, ip) {
                loginHistoryModel.IpAddress(ip);

                BWA.db.CmUserLoginHistory.insert(loginHistoryModel.toJS());

                BWA.UserInfo.logout();
                clearInterval(BemsWebApplication.app.timer); // hcLee 2015 08 07

                BWA.app.navigate('CenterLogin');
                BWA.CenterLoginOverlay.handleCheckSaveId();
            });

        },

        handleLoginButton: function () {

            BWA.UserInfo.IsLogin(false);

            if (_.isEmpty(id())) {
                utils.toast.show('아이디를 입력하여 주십시오.', 'error');
                $('#userId').focus();
                return;
            }

            if (_.isEmpty(password())) {
                utils.toast.show('비밀번호를 입력하여 주십시오.', 'error');
                $('#userPassword').focus();
                return;
            }

            $.cookie('checkCenterSaveId', checkSaveId());

            if (checkSaveId()) {
                $.cookie('centerId', id());
            }

            disabledLoginButton(true);
            disabledIdTextBox(true);
            disabledPasswordTextBox(true);
            disabledCheckSaveId(true);

            var userDataSource = BWA.DataUtil.createDataSource({
                dataSourceOptions: {
                    select: [
                        'SiteId', 'UserId', 'CompanyId', 'DepartmentId', 'PositionId', 'Name', 'Email', 'UserGroupId', 'BusinessFieldId', 'EmploymentStatus',
                        'CmCompany/Name', 'CmDepartment/Name', 'CmPosition/Name', 'CmBusinessField/Name'
                    ],
                    expand: ['CmCompany', 'CmDepartment', 'CmPosition', 'CmBusinessField'],
                    extendOptions: {
                        alterNames: {
                            'CmCompany/Name': 'CompanyName',
                            'CmDepartment/Name': 'DepartmentName',
                            'CmPosition/Name': 'PositionName',
                            'CmBusinessField/Name': 'BusinessFieldName'
                        }
                    }
                }
            }, 'CmUser');

            var userGroupPermissionDataSource = BWA.db.createDataSource('CmUserGroupPermission');

            var eq = BWA.DataUtil.constructEqualFilter;
            var and = BWA.DataUtil.andFilter;

            userDataSource.filter([
                [eq('SiteId', 0)],
                'and',
                eq('UserId', id()),
                'and',
                eq('Passwd', password()),
            ]);

            BWA.LoadIndicator.show();
            userDataSource.load().done(function (user) {

                if (_.isEmpty(user)) {
                    utils.toast.show('로그인에 실패하였습니다. 아이디 혹은 비밀번호가 다릅니다.', 'error');
                    password("");
                    return;
                }

                user = user[0];

                if (user.EmploymentStatus() == 2 || user.EmploymentStatus() == 3) {
                    utils.toast.show('휴직/퇴사 사용자는 시스템에 로그인 할 수 없습니다.', 'error');
                    return;
                }

                userGroupPermissionDataSource.filter([
                    eq('SiteId', user.SiteId()),
                    and,
                    eq('UserGroupId', user.UserGroupId()),
                ]);

                userGroupPermissionDataSource.load().done(function (dbMenuPermissions) {
                    BWA.DataUtil.copyViewModel(user, BWA.UserInfo);

                    BWA.UserInfo.MenuPermissions(_.map(dbMenuPermissions, function (x) {
                        return {
                            MenuId: x.MenuId(),
                            MenuPermission: x.MenuPermission()
                        };
                    }));

                    // hcLee 2016 06 09
                    if (BWA.UserInfo.SiteId() == 0) {
                        BWA.UserInfo.IsCenter(true);
                        //BWA.UserInfo.SiteId(1);
                    }

                    overlayOptions.visible(false);
                    utils.toast.show('로그인에 성공하였습니다.');
                    id("");
                    password("");
                    BWA.Code.PurchaseProgress.load();
                    BWA.UserInfo.IsLogin(true);

                    // 로그인 히스토리 기록 
                    var loginHistoryModel = new BemsWebApplication.CmUserLoginHistoryViewModel();
                    loginHistoryModel.SiteId = BWA.UserInfo.SiteId;
                    loginHistoryModel.UserId = BWA.UserInfo.UserId;
                    loginHistoryModel.Type('Log-On');
                    loginHistoryModel.TraceTime(new Date());
                    //2015 11 13 hcLee
                    //loginHistoryModel.IpAddress(BWA.CenterLoginOverlay.GetClientIP());
                    $.when(BWA.CenterLoginOverlay.GetClientIP()).done(function (result, ip) {
                        loginHistoryModel.IpAddress(ip);

                        BWA.db.CmUserLoginHistory.insert(loginHistoryModel.toJS());

                        var siteDataSource = BemsWebApplication.db.createDataSource('CmSite', true);
                        var eq = BWA.DataUtil.constructEqualFilter;
                        siteDataSource.filter([
                        eq('SiteId', BWA.UserInfo.SiteId()),
                        ]);

                        var bAutoControl;
                        siteDataSource.load().done(function (site) {
                            if (_.isEmpty(site)) return;
                            bAutoControl = site[0].IsControlSchedule();
                            BemsWebApplication.app.timer = setInterval(function () {
                                var now = new Date();
                                if (bAutoControl == true && now.getHours () == site[0].ScheduleCheckHour() && (now.getMinutes() == 0) && (now.getSeconds() == 0)) {
                                    BWA.ControlPanel.show();
                                }
                            }, 1000);
                        });

                        BWA.BemsFmsMode.setBemsMode('bems');                        
                        BWA.app.navigate('CenterMainDashboard');

                    });

                }).fail(handleLoginFail).always(handleAfterTryLogin);
            }).fail(handleLoginFail).always(handleAfterTryLogin);
        },

        isVisible: function () {
            return overlayOptions.visible();
        },

        show: function () {
            overlayOptions.visible(true);
        }

    };    

});