BemsWebApplication.ElecPeak = function (params, viewInfo) {
    "use strict";

    var and = BWA.DataUtil.andFilter;

    var dateBoxValue = ko.observable(new Date());
    var BUILDING_DEPTH = 1, FLOOR_DEPTH = 2, ZONE_DEPTH = 3;
    var CODE = $Code, FuelType = CODE.FuelType, FT = CODE.FacilityType, FC = CODE.FacilityCode, F = CODE.Formula, TIT = CODE.TimeIntervalType;
    var goal = ko.observable();

    var MaxDateTime = ko.observable(new Date());
    var MinDateTime = ko.observable(new Date());
    var MaxPeakValue = ko.observable(0);
    var MinPeakValue = ko.observable(0);
    var todayMaxPeakValue = ko.observable(0);
    var todayMinPeakValue = ko.observable(0);
    var SiteId = BWA.UserInfo.SiteId();
    var invisableLeft = ko.observable(false);
    var arrowCount = ko.observable(0);
    var visiblePopup = ko.observable(false);
    var timeTypesForSearch = ko.observableArray(), timeTypeIdForSearch = ko.observable(0);
    var timer;
    var initialized = false, shouldReload = false, dataSource;
    var realtime_search = true;
    var pointHistoryGet = new BWA.Chart.PointHistoryGet(SiteId), formulaGet = new BWA.Chart.FormulaGet(SiteId);

    var ElecPeakDataSource = BemsWebApplication.db.createDataSource('BemsPeakHistory'),
        CmSiteDataSource = BemsWebApplication.db.createDataSource('CmSite'),
        BemsPeakInfoDataSource = BemsWebApplication.db.createDataSource('BemsPeakInfo'),
        BemsPeakHistoryDailyDataSource = BemsWebApplication.db.createDataSource('BemsPeakHistoryDaily');
    var deferredForSearch = new $.Deferred();
    var deferredForLoadData = new $.Deferred();

    var chart = BWA.Chart.Instance('chartE8', 'dxChart');
    var timeBoxForSearch = BWA.SearchView.createDateTimeBox1($G.TimeTypesForMin, null, false);

    //  2017.09.11 : 그리드 도표 작업 : 팝업창 추가
    var DataGridPopup_Visible = ko.observable(false);
    var dataArrayresult = ko.observableArray();
    //  2017.09.11 : 그리드 도표 작업 : 팝업창 추가

    function handleSearchViewInitializeUpdate() {

    }

    function handleFacilityList() {
        viewModel.ElecPeakFacilityPopup.show(MaxDateTime);
    }

    function handleViewShown() {
        window.$SearchView.isNotUse(true);
        if (initialized === false) {
            var chartOption = BWA.ChartOptions.ElecPeak;
            chart = chart(chartOption.getChartOptionsMIN($Code.TimeType.MIN));//$Code.TimeType.MIN
            handleSearchInSearchView_renewal();
            initialized = true;
        }
        else {
            handleSearchInSearchView_renewal();
        }
        timeBoxForSearch.setDefaultDate();
        if (shouldReload) {

        }

        timer = setInterval(function () {
            var now = new Date();
            if ((now.getMinutes() % 1 == 0) && (now.getSeconds() == 58)) {
                arrowCount(0);
                invisableLeft(false);
                dateBoxValue(new Date());
                handleSearchInSearchView_renewal();
            }
        }, 1000);
    }

    function handleViewHidden() {
        visiblePopup(false);
        clearInterval(timer); // hcLee 2015 06 12
    }

    function handleViewShowing() {
        //handleSearchInSearchView_renewal();
    }

    function refreshList() {

    }

    function handleSearchInSearchView_renewal() { // 실시간용
        if (realtime_search == true) {
            visiblePopup(true);
            CmSiteDataSource.filter([
            ['SiteId', '=', SiteId]
            ]);

            CmSiteDataSource.load().done(function (datas) {
                goal = datas[0].MaxPeak();

                var end = new Date(dateBoxValue());
                var start = new Date(dateBoxValue());
                start.setDate(start.getDate() - 1);

                ElecPeakDataSource.filter([
                    ['SiteId', '=', SiteId],
                    and,
                    ['CreatedDateTime', '>=', start],
                    and,
                    ['CreatedDateTime', '<=', end]
                ]);
                var bEndData = true;
                ElecPeakDataSource.load().done(function (datas) {
                    var maxValue = 0;
                    var dataArray = [];

                    for (var i = 0; i < datas.length; i++) {
                        dataArray.push({
                            DateTime: BWA.Chart.getCustermTimeArgumentAxisString($Code.TimeType.QUARTERMIN, datas[i].CreatedDateTime()),
                            Value: datas[i].CurrentValue()
                        });
                        if (maxValue < datas[i].CurrentValue()) maxValue = datas[i].CurrentValue();
                    }
                    dataArrayresult = dataArray;

                    if (dataArray.length == 0) {
                        invisableLeft(true);
                        arrowCount(arrowCount() - 1);
                        if (arrowCount() < 0) arrowCount(0);
                        visiblePopup(false);
                        utils.toast.show('데이터가 없습니다.');
                        return;
                    }

                    if (maxValue < goal) maxValue = goal;
                    var options = BWA.ChartOptions.ElecPeak.getChartOptionsMIN($Code.TimeType.MIN, goal, maxValue);//$Code.TimeType.MIN
                    chart().option('argumentAxis', null);
                    options.dataSource = dataArray;
                    chart().option(options);
                    visiblePopup(false);
                })
                .fail(function (error) {
                    visiblePopup(false);
                });

                BemsPeakInfoDataSource.filter([
                    ['SiteId', '=', SiteId]
                ]);

                BemsPeakInfoDataSource.load().done(function (datas) {

                    MaxDateTime(datas[0].MaxDateTime());
                    MinDateTime(datas[0].MinDateTime());

                    MaxPeakValue(Math.round(datas[0].MaxPeakValue() * 100) / 100);
                    MinPeakValue(Math.round(datas[0].MinPeakValue() * 100) / 100);

                    todayMaxPeakValue(Math.round(datas[0].todayMaxPeakValue() * 100) / 100);
                    todayMinPeakValue(Math.round(datas[0].todayMinPeakValue() * 100) / 100);
                });
            });
        }
    }

    function handleSearchInSearchView() { //조회용
        var date = timeBoxForSearch.getDate();
        var end = date.endDate;
        var start = date.startDate;

        visiblePopup(true);
        if (timeBoxForSearch.type() == $Code.TimeType.HOUR) {//기존
            CmSiteDataSource.filter([
                ['SiteId', '=', SiteId]
            ]);

            CmSiteDataSource.load().done(function (datas) {
                goal = datas[0].MaxPeak();

                ElecPeakDataSource.filter([
                ['SiteId', '=', SiteId],
                and,
                ['CreatedDateTime', '>=', start],
                and,
                ['CreatedDateTime', '<=', end],
                ]);

                var bEndData = true;
                ElecPeakDataSource.load().done(function (datas) {

                    var maxValue = 0;
                    var dataArray = [];
                    for (var i = 0; i < datas.length; i++) {
                        dataArray.push({
                            DateTime: BWA.Chart.getCustermTimeArgumentAxisString($Code.TimeType.QUARTERMIN, datas[i].CreatedDateTime()),
                            Value: datas[i].CurrentValue()
                        });
                        if (maxValue < datas[i].CurrentValue()) maxValue = datas[i].CurrentValue();
                    }
                    dataArrayresult = dataArray;

                    if (dataArray.length == 0) {
                        invisableLeft(true);

                        arrowCount(arrowCount() - 1);
                        if (arrowCount() < 0) arrowCount(0);

                        visiblePopup(false);
                        utils.toast.show('데이터가 없습니다.');
                        return;
                    }
                    if (maxValue < goal) maxValue = goal;
                    var options = BWA.ChartOptions.ElecPeak.getChartOptionsMIN($Code.TimeType.MIN, goal, maxValue);//$Code.TimeType.MIN
                    chart().option('argumentAxis', null);
                    options.dataSource = dataArray;
                    chart().option(options);
                    visiblePopup(false);
                })
                .fail(function (error) {
                    visiblePopup(false);
                });

                BemsPeakInfoDataSource.filter([
                    ['SiteId', '=', SiteId]
                ]);

                BemsPeakInfoDataSource.load().done(function (datas) {

                    MaxDateTime(datas[0].MaxDateTime());
                    MinDateTime(datas[0].MinDateTime());

                    MaxPeakValue(Math.round(datas[0].MaxPeakValue() * 100) / 100);
                    MinPeakValue(Math.round(datas[0].MinPeakValue() * 100) / 100);

                    todayMaxPeakValue(Math.round(datas[0].todayMaxPeakValue() * 100) / 100);
                    todayMinPeakValue(Math.round(datas[0].todayMinPeakValue() * 100) / 100);
                });
            });
        }
        else if (timeBoxForSearch.type() == $Code.TimeType.DAY) {
            CmSiteDataSource.filter([
                ['SiteId', '=', SiteId]
            ]);

            CmSiteDataSource.load().done(function (datas) {
                goal = datas[0].MaxPeak();

                BemsPeakHistoryDailyDataSource.filter([
                ['SiteId', '=', SiteId],
                and,
                ['CreatedDateTime', '>=', start],
                and,
                ['CreatedDateTime', '<=', end],
                ]);

                var bEndData = true;
                BemsPeakHistoryDailyDataSource.load().done(function (datas) {

                    var maxValue = 0;
                    var dataArray = [];
                    var tempdataArray = [];
                    for (var i = 0; i < datas.length; i++) {
                        tempdataArray.push({
                            DateTime: datas[i].CreatedDateTime(),
                            MaxDateTime: datas[i].MaxDateTime(),
                            Value: datas[i].MaxPeakValue()
                        });
                        dataArray.push({
                            DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), datas[i].CreatedDateTime()),
                            MaxDateTime: BWA.Chart.getCustermTimeArgumentAxisString($Code.TimeType.QUARTERMIN, datas[i].MaxDateTime()),
                            Value: datas[i].MaxPeakValue()
                        });
                        if (maxValue < datas[i].MaxPeakValue()) maxValue = datas[i].MaxPeakValue();
                    }
                    dataArrayresult = dataArray;

                    if (dataArray.length == 0) {
                        invisableLeft(true);

                        arrowCount(arrowCount() - 1);
                        if (arrowCount() < 0) arrowCount(0);

                        visiblePopup(false);
                        utils.toast.show('데이터가 없습니다.');
                        return;
                    }
                    if (maxValue < goal) maxValue = goal;

                    var options1 = BWA.ChartOptions.ElecPeak.getChartOptionsDAY($Code.TimeType.DAY, goal, maxValue, start, end);//$Code.TimeType.MIN
                    chart().option('argumentAxis', null);
                    options1.dataSource = tempdataArray;
                    chart().option(options1);
                    visiblePopup(false);
                })
                .fail(function (error) {
                    visiblePopup(false);
                });

                BemsPeakInfoDataSource.filter([
                    ['SiteId', '=', SiteId]
                ]);

                BemsPeakInfoDataSource.load().done(function (datas) {

                    MaxDateTime(datas[0].MaxDateTime());
                    MinDateTime(datas[0].MinDateTime());

                    MaxPeakValue(Math.round(datas[0].MaxPeakValue() * 100) / 100);
                    MinPeakValue(Math.round(datas[0].MinPeakValue() * 100) / 100);

                    todayMaxPeakValue(Math.round(datas[0].todayMaxPeakValue() * 100) / 100);
                    todayMinPeakValue(Math.round(datas[0].todayMinPeakValue() * 100) / 100);
                });
            });
        }
        else {
            CmSiteDataSource.filter([
               ['SiteId', '=', SiteId]
            ]);

            CmSiteDataSource.load().done(function (datas) {
                goal = datas[0].MaxPeak();

                var cnt = Math.round((end - start) / (24 * 60 * 60 * 1000 * 30));
                var dataArray = [];
                var tempdataArray = [];
                for (var i = 0; i < cnt; i++) {
                    tempdataArray.push({
                        DateTime: new Date(start.getFullYear(), start.getMonth() + i, 1, 0, 0, 0),
                        MaxDateTime: new Date(start.getFullYear(), start.getMonth() + i, 1, 0, 0, 0),
                        Value: 0
                    });
                    dataArray.push({
                        DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), new Date(start.getFullYear(), start.getMonth() + i, 1, 0, 0, 0)),
                        MaxDateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), new Date(start.getFullYear(), start.getMonth() + i, 1, 0, 0, 0)),
                        Value: 0
                    });
                }

                BemsPeakHistoryDailyDataSource.filter([
                ['SiteId', '=', SiteId],
                and,
                ['CreatedDateTime', '>=', start],
                and,
                ['CreatedDateTime', '<=', end],
                ]);

                var bEndData = true;
                BemsPeakHistoryDailyDataSource.load().done(function (datas) {
                    if (datas.length != 0) {
                        var maxValue = 0;
                        for (var i = 0; i < datas.length; i++) {
                            for (var j = 0; j < dataArray.length; j++) {
                                if (datas[i].CreatedDateTime().getFullYear() == tempdataArray[j].DateTime.getFullYear() && datas[i].CreatedDateTime().getMonth() == tempdataArray[j].DateTime.getMonth()) {
                                    if (dataArray[j].Value < datas[i].MaxPeakValue()) {
                                        tempdataArray[j].Value = datas[i].MaxPeakValue();
                                        tempdataArray[j].MaxDateTime = datas[i].MaxDateTime(),
                                        dataArray[j].MaxDateTime = BWA.Chart.getCustermTimeArgumentAxisString($Code.TimeType.QUARTERMIN, datas[i].MaxDateTime()),
                                        dataArray[j].Value = datas[i].MaxPeakValue();
                                    }
                                    break;
                                }
                            }
                        }
                        dataArrayresult = dataArray;

                        if (dataArray.length == 0) {
                            invisableLeft(true);

                            arrowCount(arrowCount() - 1);
                            if (arrowCount() < 0) arrowCount(0);

                            visiblePopup(false);
                            utils.toast.show('데이터가 없습니다.');
                            return;
                        }
                        if (maxValue < goal) maxValue = goal;
                        var options2 = BWA.ChartOptions.ElecPeak.getChartOptionsMONTH($Code.TimeType.MONTH, goal, maxValue, start, end);//$Code.TimeType.MIN
                        chart().option('argumentAxis', null);
                        options2.dataSource = tempdataArray;//dataArraytempdataArray
                        chart().option(options2);
                        visiblePopup(false);
                    }
                })
                .fail(function (error) {
                    visiblePopup(false);
                });

                BemsPeakInfoDataSource.filter([
                    ['SiteId', '=', SiteId]
                ]);

                BemsPeakInfoDataSource.load().done(function (datas) {

                    MaxDateTime(datas[0].MaxDateTime());
                    MinDateTime(datas[0].MinDateTime());

                    MaxPeakValue(Math.round(datas[0].MaxPeakValue() * 100) / 100);
                    MinPeakValue(Math.round(datas[0].MinPeakValue() * 100) / 100);

                    todayMaxPeakValue(Math.round(datas[0].todayMaxPeakValue() * 100) / 100);
                    todayMinPeakValue(Math.round(datas[0].todayMinPeakValue() * 100) / 100);
                });
            });
        }
    }

    var searchViewOptions = {
        searchViewItems: [
            { id: 'TimeTypeId', defaultValue: 0, value: timeTypeIdForSearch, dataSource: timeTypesForSearch },
            { id: 'DateForHour', type: 'dateRange', isOnlyDate: true },
            { id: 'TimeForHour', type: 'dateRange', isOnlyDate: true },
        ],
        promiseDataInSearchView: deferredForSearch.promise()
    };

    function handleMenuItemClick(e) {
    }

    //  2017.09.11 : 그리드 도표 작업 : 팝업창 추가
    function DataGridPopup_ButtonClick() {
        DataGridPopup_Visible(true);
    }

    function handlePopupShown() {
        if (timeBoxForSearch.type() == $Code.TimeType.HOUR) {
            viewModel.ElecPeakDataGridOptions.columns[0].format = 'yyyy-MM-dd HH:mm';
            if (viewModel.ElecPeakDataGridOptions.columns[2])
                viewModel.ElecPeakDataGridOptions.columns[2] = null;
        }
        else if (timeBoxForSearch.type() == $Code.TimeType.DAY) {
            viewModel.ElecPeakDataGridOptions.columns[0].format = 'yyyy-MM-dd';
            if (viewModel.ElecPeakDataGridOptions.columns[2] == null)
                viewModel.ElecPeakDataGridOptions.columns[2] = {
                    dataField: 'MaxDateTime', caption: "피크날짜", width: '50%', alignment: 'center', format: 'yyyy-MM-dd HH:mm'
                };
        }
        else {
            viewModel.ElecPeakDataGridOptions.columns[0].format = 'yyyy-MM';
            if (viewModel.ElecPeakDataGridOptions.columns[2] == null)
                viewModel.ElecPeakDataGridOptions.columns[2] = {
                    dataField: 'MaxDateTime', caption: "피크날짜", width: '50%', alignment: 'center', format: 'yyyy-MM-dd HH:mm'
                };
        }
        if (realtime_search) {
            if (viewModel.ElecPeakDataGridOptions.columns[2])
                viewModel.ElecPeakDataGridOptions.columns[2] = null;
        }
        $("#ElecPeakDataGrid_Container").dxDataGrid("instance").option("dataSource", dataArrayresult);
        DataGridPopup_Visible(true);
    }
    //  2017.09.11 : 그리드 도표 작업 : 팝업창 추가

    var viewModel = $.extend(BWA.CommonView.create(
            params, viewInfo, searchViewOptions, ko.observable(null), handleViewShown, null,
            handleSearchInSearchView, handleSearchViewInitializeUpdate), {

                refreshList: refreshList,
                viewShowing: handleViewShowing,
                viewHidden: handleViewHidden, // hcLee 2015 03 23
                processValueChange: function (e) {
                    if (e.value == '실시간') {
                        realtime_search = true;
                        $("#search").dxButton({
                            disabled: true
                        });
                    }
                    else {
                        realtime_search = false;
                        $("#search").dxButton({
                            disabled: false
                        });
                    }
                },
                handleMenuItemClick: handleMenuItemClick,
                menuItems: [{
                    text: '엑셀(csv) 내보내기'
                }],
                dateBoxValue: dateBoxValue,
                MaxPeakValue: function () { return MaxPeakValue() },
                MaxDateTime: function () { return MaxDateTime() },
                MinPeakValue: function () { return MinPeakValue() },
                MinDateTime: function () { return MinDateTime() },
                todayMaxPeakValue: function () { return todayMaxPeakValue() },
                todayMinPeakValue: function () { return todayMinPeakValue() },
                arrowCount: function () { return arrowCount() },
                invisableLeft: function () { return invisableLeft() },
                boxOptions: {
                    direction: 'row', width: '75%', height: 120,
                },
                ElecPeakDataGridPopup_ButtonClicked: DataGridPopup_ButtonClick
            });
    viewModel.timeBoxForSearch = timeBoxForSearch;

    //  2017.09.11 : 그리드 도표 작업 : 팝업창 추가
    viewModel.ElecPeakDataGridPopupOptions = {
        width: '450px',
        height: '830px',
        contentTemplate: "content",
        showTitle: true,
        title: "도표",
        visible: DataGridPopup_Visible,
        dragEnabled: true,
        closeOnOutsideClick: true,
        shownAction: handlePopupShown,
        animation: window.utils.popup.createAnimation(),
        shading: false
    };
    //  2017.09.11 : 그리드 도표 작업 : 팝업창 추가

    $HourGlassPopup(viewModel, visiblePopup);
    viewModel.ElecPeakFacilityPopup = $ElecPeakFacilityPopup(viewModel, null, false, null);

    //  2017.09.11 : 그리드 도표 작업 : 팝업창 추가
    viewModel.ElecPeakDataGridOptions = {
        dataSource: dataArrayresult,
        columns: [
            { dataField: 'DateTime', caption: "날짜", width: '50%', alignment: 'center', format: 'yyyy-MM-dd HH:mm' },// dataType: 'date', format: 'yyyy-MM-dd HH:mm' },            
            { dataField: 'Value', caption: "전력피크", width: '50%', alignment: 'center', format: 'fixedPoint', precision: 2 },
            { dataField: 'MaxDateTime', caption: "피크날짜", width: '50%', alignment: 'center', format: 'yyyy-MM-dd HH:mm' },// dataType: 'date', format: 'yyyy-MM-dd HH:mm' },
        ],
        "export": {
            enabled: true,
            fileName: '전력피크'
        }
    };
    //  2017.09.11 : 그리드 도표 작업 : 팝업창 추가
    return viewModel;
};