$(function () {
    'use strict';

    // 디버깅 모드 설정(자동로그인 관련)
    //var debug = true;
    var debug = false;

    var eq = BWA.DataUtil.constructEqualFilter;
    // 로그인 후 이동하게될 화면 설정 
    //var viewAfterLogin = 'ExecutionSchedule';
    var siteid = ko.observable(''),
        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 menuDataSource = BWA.db.createDataSource('CmMenu');

    var overlayOptions = {
        width: '100%',
        height: '100%',
        visible: ko.observable(false),
        animation: null,
        shading: true,
        showingAction: function () {
            BWA.UserPanel.hide();
        },
        shownAction: function () {
            if (BemsWebApplication.config.siteenable) {
                $('#imageId').attr('src', '/Images/Login/intro_login_box_2.png');
                document.getElementById("userId").className = "login_id_area_content2";
                document.getElementById("userPassword").className = "login_pw_area_content2";
            }
            else {
                $('#imageId').attr('src', '/Images/Login/intro_login_box.png');
                document.getElementById("userId").className = "login_id_area_content";
                document.getElementById("userPassword").className = "login_pw_area_content";
            }
        },
        contentReadyAction: function (e) {
            BWA.LoginOverlay.handleCheckSaveId();
        }
    };

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

    function updateMenuHide(vid) {
        _.each($SideMenu.sideMenuSet, function (items, id) {
            (function MenuHide(array, id, exelement) {
                _.each(array, function (element) {
                    if (element.viewId == (typeof (vid) == "object" ? vid.MenuId() : vid)) {
                        element.show(false);
                        if (exelement != null) {
                            if (exelement.subMenus != null) {
                                var cnt = 0;
                                for (var i = 0; i < exelement.subMenus.length; i++) {
                                    if (exelement.subMenus[i].show() == false) {
                                        cnt++;
                                        if (exelement.subMenus.length == cnt) {
                                            exelement.show(false);
                                        }
                                    }
                                }
                            }
                        }
                        return;
                    }
                    if (element.subMenus) {
                        return MenuHide(element.subMenus, (typeof (vid) == "object" ? vid.MenuId() : vid), element);
                    }
                });
            })(items, id);
        })
    }

    //2018 02 19 hcLee
    function initMenu() {
        _.each($SideMenu.sideMenuSet, function (items, id) {
            (function MenuShow(array, id) {
                _.each(array, function (element) {
                    element.show(true);
                    if (element.subMenus) {
                        return MenuShow(element.subMenus, id);
                    }
                });
            })(items, id);
        })
    }

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

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

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

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

            if (debug) {
                id('admin');
                password('kanu123');
                //id('lee');
                //password('lee');
            }
        },
        overlayOptions: overlayOptions,

        getsiteIdTextBoxOptions: function () {
            if (BemsWebApplication.config.siteenable) {
                return {
                    value: siteid,
                    disabled: disabledIdTextBox,
                    visible: true,
                    placeholder: ' siteID', //placeholder: $G('id'), 
                };
            }
            else {
                return {
                    value: siteid,
                    disabled: disabledIdTextBox,
                    visible: false,
                    placeholder: ' siteID', //placeholder: $G('id'), 
                };
            }
        },

        getIdTextBoxOptions: function () {
            return {
                value: id,
                disabled: disabledIdTextBox,
                // cyim 2016.02.17 : 로그인화면 작업     
                placeholder: ' username', //placeholder: $G('id'), 

                // hcLee 2016 01 25 크롬은 문제없으나 IE 8,9,10에서는 동작안하는 버그 떄문에 직접코드 체크로 변경함
                /*enterKeyAction: function (e) {
                    BWA.LoginOverlay.handleLoginButton();*/
                onKeyPress: function (e) {
                    if (e.jQueryEvent.charCode == 13)
                        BWA.LoginOverlay.handleLoginButton();
                }
            };
        },

        getPasswordTextBoxOptions: function () {
            return {
                value: password,
                disabled: disabledPasswordTextBox,
                mode: 'password',
                // cyim 2016.02.17 : 로그인화면 작업  
                placeholder: ' password',//placeholder: $G('password'),
                // hcLee 2016 01 25 크롬은 문제없으나 IE 8,9,10에서는 동작안하는 버그 떄문에 직접코드 체크로 변경함
                /*enterKeyAction: function (e) {
                    BWA.LoginOverlay.handleLoginButton();*/
                onKeyPress: function (e) {
                    //if (e.jQueryEvent.char == '\n') { onKeyDown or onKeyUp의 경우는 이렇게
                    if (e.jQueryEvent.charCode == 13) {
                        $('#loginbtn').focus();
                        BWA.LoginOverlay.handleLoginButton();
                        //$('#userPassword').focus();
                    }
                }
            };
        },

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

        getButtonOptions: function () {
            return {
                // cyim 2016.02.17 : 로그인화면 작업 (이미지로 대체함)  
                //icon: 'key',                
                //text: $G('login'),
                disabled: disabledLoginButton,
                clickAction: BWA.LoginOverlay.handleLoginButton
            };
        },

        GetClientIP: function () {
            //return "127.0.0.1";

            /* node js
            require('dns').lookup(require('os').hostname(), function (err, add, fam) {
                //console.log('addr: ' + add);
                alert(add);
            })*/

            //alert(ko.observable(data.IpAddress));
            //return "127.0.0.1";

            var dfd = $.Deferred();
            var urlHeader = BemsWebApplication.config.endpoints.api[BemsWebApplication.config.mode];
            /*$.get("http://ipinfo.io", function(response) {
                //console.log(response.city, response.region, response.country);
                return dfd.resolve(true, response.ip);
            }, "jsonp");*/
            $.get(urlHeader + "/ClientAccess/ClientIpAddress", function (response) {
                if (response.ip === '::1') {
                    response.ip = '127.0.0.1';
                }
                //console.log(response.city, response.region, response.country);
                return dfd.resolve(true, response.ip);
            });
            return dfd.promise();

            /*
            $.when($.get("http://ipinfo.io", function (response){return response.ip;
            }, "jsonp"))
            .done(function (ip) {
                return ip;
            });*/

            /*
                        var xmlhttp;
            
                        if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest();
                        else xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            
                        xmlhttp.open("GET", "http://api.hostip.info/get_html.php", false);
                        xmlhttp.send();
            
                        var hostipInfo = xmlhttp.responseText.split("n");
            
                        //for (var i=0; hostipInfo.length >= i; i++) {
                        var ipAddress = hostipInfo[hostipInfo.length - 1].split(": ");
                        //if ( ipAddress[0] == "IP" ) return ipAddress[1];
                        var IP = ipAddress[1].split('\n');
                        return IP[0]; */
        },

        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());

            //hcLee 2015 11 13
            //loginHistoryModel.IpAddress(BWA.LoginOverlay.GetClientIP());

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

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

                BWA.UserInfo.logout();
                if (!checkSaveId()) //2018 03 31 hcLee
                {
                    $.removeCookie('id');
                    $.removeCookie('siteId');
                }
                $.removeCookie('password');
                $.removeCookie('fromCenter')

                clearInterval(BemsWebApplication.app.timer); // hcLee 2015 08 07
                //2015 10 28 hcLee 초기화 문제 해결
                //alert(Request.UserHostAddress);
                //alert(BWA.LoginOverlay.GetClientIP());
                //2018 03 31 hcLee
                location.reload();
                //window.
                //location.
                /*
                BWA.app.navigate('Login');
                BWA.LoginOverlay.handleCheckSaveId();*/
            });
        },

        handleLoginButton: function () {
            var siteId;
            if (BemsWebApplication.config.siteenable) {
                siteId = parseInt(siteid());
            }
            else {
                siteId = BemsWebApplication.config.siteId;
            }
            if (BWA.config["center-mode"]) {
                if ($.cookie('fromCenter')) {
                    var userId = $.cookie('id');
                    var userPassword = $.cookie('password');
                    siteId = $.cookie('siteId') * 1;

                    if (userId) id(userId);
                    if (userPassword) password(userPassword);
                    if (siteId) siteid(siteId);
                }
            }

            BWA.UserInfo.IsLogin(false);

            //alert(password());
            if (BemsWebApplication.config.siteenable) {
                if (_.isEmpty(siteid())) {
                    utils.toast.show('사이트 아이디를 입력하여 주십시오.', 'error');
                    $('#siteId').focus();
                    return;
                }
            }

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

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

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

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

            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', 'CmUserGroup/Name'
                    ],
                    expand: ['CmCompany', 'CmDepartment', 'CmPosition', 'CmBusinessField', 'CmUserGroup'],
                    extendOptions: {
                        alterNames: {
                            'CmCompany/Name': 'CompanyName',
                            'CmDepartment/Name': 'DepartmentName',
                            'CmPosition/Name': 'PositionName',
                            'CmBusinessField/Name': 'BusinessFieldName',
                            'CmUserGroup/Name': 'UserGroupName',
                        }
                    }
                }
            }, 'CmUser');

            var userGroupPermissionDataSource = BWA.db.createDataSource('CmUserGroupPermission');
            // hcLee 2018 02 23
            var chartInfoDataSource = BWA.db.createDataSource('BemsChartInfo');

            var eq = BWA.DataUtil.constructEqualFilter;
            var and = BWA.DataUtil.andFilter;
            if (BemsWebApplication.config.siteenable) {
                userDataSource.filter([
                eq('SiteId', siteId), // hcLee 2016 06 09 수정
                'and',
                eq('UserId', id()),
                'and',
                eq('Passwd', password()),
                ]);
            }
            else {
                userDataSource.filter([
                [eq('SiteId', BemsWebApplication.config.siteId), 'or', eq('SiteId', 0)], // hcLee 2016 06 09 수정
                '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()),
                ]);

                // hcLee 2018 02 23
                chartInfoDataSource.filter([eq('SiteId', user.SiteId()), and, eq('UseChart', true)]);

                $.when(userGroupPermissionDataSource.load(), chartInfoDataSource.load()
                ).done(function (dbMenuPermissions, chartInfos) {
                    //userGroupPermissionDataSource.load().done(function (dbMenuPermissions) {

                    BWA.DataUtil.copyViewModel(user, BWA.UserInfo);
                    BWA.UserInfo.chartInfo(chartInfos[0]);

                    BWA.UserInfo.MenuPermissions(_.map(dbMenuPermissions[0], 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);
                    }

                    var CmSite = BemsWebApplication.db.createDataSource('CmSite');
                    CmSite.filter([
                        ['SiteId', '=', BWA.UserInfo.SiteId()]
                    ]);

                    CmSite.load().done(function (result) {
                        var dataArray = [];
                        _.each(result, function (x) {
                            dataArray.push({
                                SiteName: x.Name()
                            });
                            BWA.Desktop.SiteName = dataArray[0].SiteName;
                            $('#site-name').html(dataArray[0].SiteName);
                            $('#version-name').html(BemsWebApplication.config.Version);
                        });
                    });

                    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.LoginOverlay.GetClientIP());
                    $.when(BWA.LoginOverlay.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) || site[0].IsControlSchedule() == false) {
                            if (_.isEmpty(site)) return;
                            bAutoControl = site[0].IsControlSchedule();
                            // hcLee 공조기 제어 팝업
                            //BWA.ControlPanel.show();
                            BemsWebApplication.app.timer = setInterval(function () {
                                var now = new Date();
                                //if (bAutoControl == false && now.getHours () == site[0].ScheduleCheckHour() && (now.getMinutes() == 0) && (now.getSeconds() == 0)) {
                                // 2016 06 21 두소장과 협의, 플래그가 true면 수동 제어 팝업, 스케줄 자동제어는 플래그 상관없이 동작 안하도록 막음
                                if (bAutoControl == true && now.getHours() == site[0].ScheduleCheckHour() && (now.getMinutes() == 0) && (now.getSeconds() == 0)) {
                                    BWA.ControlPanel.show();
                                }
                                /* 제어팝업 데모 때문에 막음 2015 12 09
                                if (bAutoControl == true && (now.getMinutes() == site[0].ScheduleCheckHour()) && BWA.UserInfo.IsScheduleUser() && (now.getSeconds() == 0)) {
                                    BWA.ControlPanel.show();
                                }*/
                            }, 1000);
                        });

                        initMenu(); //2018 02 19 hcLee
                        //$SideMenu.sideMenuSet = [];
                        /*
                        if ($SideMenu.sideMenuSet.navConfiguration != undefined)
                            delete $SideMenu.sideMenuSet.navConfiguration;*/
                        //BWA.SetMenunavConfiguration();
                        //BWA.SetMenunavMaterial();

                        //$SideMenu.showSideMenuIfWill();
                        // 2018 01 19 hcLee, admin이 아니면 메뉴설정은 안보인다.
                        //if (BWA.UserInfo.UserId() != "admin")

                        // 20190828 admin 계정을 제외한 사용자 정보 확인 페이지 차단
                        if (BWA.UserInfo.UserId() == "admin")
                            menuDataSource.filter([
                                eq('SiteId', BWA.UserInfo.SiteId()),
                                and,
                                eq('Used', false)
                            ]);
                        else {
                            menuDataSource.filter([
                                eq('SiteId', BWA.UserInfo.SiteId()),
                                and,
                                [eq('Used', false), 'or', eq('MenuId', 'UserCheck')]
                            ]);
                        }

                        menuDataSource.load().done(function (hideMenus) {
                            $.each(hideMenus, function (i, item) {
                                updateMenuHide(item);
                            });

                            if (BWA.UserInfo.UserId() != "admin") updateMenuHide('SetMenu');
                            if (BWA.UserInfo.UserId() != "admin") updateMenuHide('SetChart');

                            if (BWA.config['BemsFmsMode'] != 0) {
                                if ($("#mode_button").dxButton("instance") != null) {
                                    $("#mode_button").dxButton("instance").option("visible", false);
                                }
                            } else {
                                if ($("#mode_button").dxButton("instance") != null) {
                                    $("#mode_button").dxButton("instance").option("visible", true);
                                }
                            }
                            if (BWA.config['BemsFmsMode'] == 2) {
                                BWA.BemsFmsMode.setBemsMode(false);
                                BWA.app.navigate('MainDashboardFMS');
                            } else {
                                BWA.BemsFmsMode.setBemsMode('bems');
                                BWA.app.navigate('MainDashboard');
                            }
                        });
                    });

                    // 알람 정보를 출력하자
                    if (BemsWebApplication.config.control) {
                        AlarmLog();
                        SetAlarmInfo();
                    }

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

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

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

    // 알람 로그
    var alarm_image = false;

    // 알람 정보를 출력하자
    function SetAlarmInfo() {

        // 1초에 한번 TICK
        var alarm_timer = setInterval(function () {

            var now = new Date();
            var minute = now.getMinutes();
            var second = now.getSeconds();
            if (((minute == 1) || (minute == 16) || (minute == 31) || (minute == 46)) && (second == 10)) {

                // 팝업이 열려 있으면 닫았다가 다시 열자
                $("#PopupAlarm").dxPopup('instance').option('visible', false);
                // 알람 로그
                AlarmLog();
            }

            // 알람이 존재한다
            if (BWA.AlarmInfo.Alarm_Image_Change() == true) {
                if (alarm_image == false) {
                    $("#alarm_button").dxButton("instance").option("type", "danger");
                    alarm_image = true;
                }
                else {
                    $("#alarm_button").dxButton("instance").option("type", "normal");
                    alarm_image = false;
                }
            }
            else // 알람이 없다(알람 해제 실행시)
            {
                if ($("#alarm_button").dxButton("instance") != null) {
                    $("#alarm_button").dxButton("instance").option("type", "normal");
                }
                alarm_image = false;
            }
        }, 1000);
    }

    function AlarmLog() {

        var BemsAlarmLogDataSource = BemsWebApplication.DataUtil.createDataSource({

            dataSourceOptions: {
                select: [
                    'CreatedDateTime', 'BemsAlarmSetting/FacilityName', 'BemsAlarmSetting/PointName', 'CurrentValue', 'BemsAlarmSetting/UpperLimit', 'BemsAlarmSetting/LowerLimit', 'SMSResult', 'EmailResult',
                    'SiteId', 'FacilityTypeId', 'FacilityCode', 'PropertyId', 'FormulaId'
                ],
                expand: ['BemsAlarmSetting'],
                extendOptions: {
                    forceOriginalField: true,
                    alterNames: {
                        'BemsAlarmSetting/FacilityName': 'FacilityName',
                        'BemsAlarmSetting/PointName': 'PointName',
                        'BemsAlarmSetting/UpperLimit': 'UpperLimit',
                        'BemsAlarmSetting/LowerLimit': 'LowerLimit'
                    }
                },
                filter: [
                    ['SiteId', '=', BWA.UserInfo.SiteId()],
                    'and',
                    ['Conform', '=', false]
                ]
            }

        }, 'BemsAlarmLog');

        BemsAlarmLogDataSource.load().done(function (result) {

            if (result.length > 0) BWA.AlarmInfo.Alarm_Image_Change = true;
            else BWA.AlarmInfo.Alarm_Image_Change = false;

            var DataArrayInfo = [];
            _.each(result, function (x) {

                var temp = '';
                if (x.FormulaId() != 0) {
                    temp = '성능분석';
                }
                else {
                    if (x.FacilityTypeId() == 99) {
                        temp = '가상시설';
                    }
                    else {
                        temp = '일반시설';
                    }
                }

                DataArrayInfo.push({
                    CreatedDateTime: x.CreatedDateTime,
                    Type: temp,
                    FacilityName: x.FacilityName,
                    PropertyName: x.PointName,
                    CurrentValue: x.CurrentValue,
                    UpperLimit: x.UpperLimit,
                    LowerLimit: x.LowerLimit,
                    SMSResult: x.SMSResult,
                    EmailResult: x.EmailResult,
                    Check: "확인",
                    SiteId: x.SiteId,
                    FacilityTypeId: x.FacilityTypeId,
                    FacilityCode: x.FacilityCode,
                    PropertyId: x.PropertyId,
                    FormulaId: x.FormulaId
                });
            });

            //$("#gridContainer").dxDataGrid("instance").option("dataSource", DataArrayInfo);
            if (result.length > 0) // 알람 정보가 있을때만 팝업 출력
            {
                $("#PopupAlarm").dxPopup('instance').option('visible', true);
            }
        })
    }
});