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

    var initialized = false,
    shouldReload = false,
    dataSource;

    var CO2 = $Code.FuelType.WATER + 1;
    var visiblePopup = ko.observable(false);
    var fuelTypesDataSource = BemsWebApplication.db.createDataSource('BemsFuelType'),
        factorCo2DataSource = BemsWebApplication.db.createDataSource('BemsFactorCo2'),
        fuelTypesForSearch = ko.observableArray(),
        timeTypesForSearch = ko.observableArray(),
        timeTypeIdForSearch = ko.observable(0),
        fuelTypeIdForSearch = ko.observable(),
        deferredForSearch = new $.Deferred();

    var factorCo2 = null;

    var energyUsageStatusGet = new BWA.Chart.EnergyUsageStatusGet(BWA.UserInfo.SiteId()),
        timeBoxForSearch = BWA.SearchView.createDateTimeBox($G.TimeTypesForDayOnly),
        dataArray = ko.observableArray();

    //  2017.11.29 : 그리드 도표 작업 : 팝업창 추가
    // 팝업창뷰 보이기 속성 제어용 변수 선언
    var DataGridPopup_Visible = ko.observable(false);
    var DataGridPopup_Visible1 = ko.observable(false);
    var dataArrayresult = ko.observableArray();
    var dataArrayresult1 = ko.observableArray();
    //  2017.11.29 : 그리드 도표 작업 : 팝업창 추가

    var chart = BWA.Chart.Instance('chartDYA', 'dxChart');

    timeTypesForSearch($G.TimeTypes);

    var m = moment();
    /*
    dataArray([
        { DateTime: new Date(m.year(), m.month(), m.date(), 0), Value: 30, PowerCo2: 40, GasCo2: 40, WaterCo2: 40 },
        { DateTime: new Date(m.year(), m.month(), m.date(), 0, 15), Value: 32 },
        { DateTime: new Date(m.year(), m.month(), m.date(), 0, 30), Value: 33 },
        { DateTime: new Date(m.year(), m.month(), m.date(), 0, 45), Value: 34 },
        { DateTime: new Date(m.year(), m.month(), m.date(), 1), Value: 50, PowerCo2: 40, GasCo2: 40, WaterCo2: 40 },
        { DateTime: new Date(m.year(), m.month(), m.date(), 2), Value: 60, PowerCo2: 40, GasCo2: 40, WaterCo2: 40 },
        { DateTime: new Date(m.year(), m.month(), m.date(), 3), Value: 80, PowerCo2: 40, GasCo2: 40, WaterCo2: 40 },
        { DateTime: new Date(m.year(), m.month(), m.date(), 4), Value: 100, PowerCo2: 40, GasCo2: 40, WaterCo2: 40 },
        { DateTime: new Date(m.year(), m.month(), m.date(), 5), Value: 40, PowerCo2: 40, GasCo2: 40, WaterCo2: 40 },
        { DateTime: new Date(m.year(), m.month(), m.date(), 6), Value: 120, PowerCo2: 40, GasCo2: 40, WaterCo2: 40 }
    ]);*/

    function handleViewShown() {

        if (initialized === false) {
            //chart = BWA.ChartOptions.DayYear.getChartOptions($Code.TimeType.HOUR);
            //chart = chart(BWA.ChartOptions.DayYearAnalysis.getChartOptions($Code.TimeType.HOUR));
            chart = chart(BWA.ChartOptions.DayYearAnalysis.getChartOptions($Code.TimeType.HOUR));

            initialized = true;
        }

        if (shouldReload) {
            //shouldReload = false;
            //dataSource.pageIndex(0);
            //dataSource.load();
        }
        factorCo2DataSource.load().done(function (dbFactorCo2) {
            factorCo2 = BWA.Bems.refineFactorCo2DataArray(dbFactorCo2);
        });
    }

    function handleViewHidden() {
        visiblePopup(false);
        $SearchView.visibleObservable(false); // hcLee 2015 03 23
        //hideOverlay();
        //    var dataGrid = $('#gridContainer').dxDataGrid('instance');
        //    dataGrid.clearSelection();
    }

    function handleViewShowing() {
        $.when(fuelTypesDataSource.load()).done(function (fuelTypes) {
            //fuelTypes.push({
            //    FuelTypeId: ko.observable(CO2),
            //    Name: ko.observable('CO2')
            //});
            fuelTypesForSearch($SearchView.filterObservableArrayForSelectBox('FuelTypeId', fuelTypes));
            deferredForSearch.resolve();
            handleSearchInSearchView();
        });
    }

    function refreshList() {
        //dataSource.pageIndex(0);
        //dataSource.load();
    }

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

    function handleSearchInSearchView() {
        visiblePopup(true);
        $("#large-indicator").dxLoadIndicator({
            height: 60,
            width: 60
        });

        var date = timeBoxForSearch.getDate(),
            timeType = timeBoxForSearch.type(),
            fuelTypeId = fuelTypeIdForSearch();
        var options = BWA.ChartOptions.DayYearAnalysis.getSeriesOptions(fuelTypeIdForSearch(), timeBoxForSearch.type());
        var request = energyUsageStatusGet.requestGetForUsgaeStatus.bind(energyUsageStatusGet); // this.apiUri = 'BemsFormula/Calculation'; 이거 사용함.2015 05 15 hcLee
        var LaststartDate = moment(date.startDate).subtract(1, 'years');
        var LastendtDate = moment(date.endDate).subtract(1, 'years');
        var dateLast = BWA.Chart.getLastYearSameWeekDate(LaststartDate, LastendtDate, date.startDate.getDay());

        if (fuelTypeId === CO2) {
            var promises = [];
            var fuelTypes = _.values($Code.FuelType);

            _.each(fuelTypes, function (fuelTypeId) {
                promises.push(request(fuelTypeId, timeType)(date.startDate, date.endDate));
            });

            _.each(fuelTypes, function (fuelTypeId) {
                promises.push(request(fuelTypeId, timeType)(dateLast.startDate, dateLast.endDate));
            });

            var calculate = factorCo2.calculate;
            $.when.apply(this, promises)
            .done(function (electricityArray, gasArray, waterArray, electricityArrayL, gasArrayL, waterArrayL) {

                var dday = new Array('일', '월', '화', '수', '목', '금', '토');

                var chartDataSource = [];
                var chartDataSourceLast = [];

                var chartDataSource_temp = [];
                var chartDataSource_temp1 = [];
                var chartDataSource_temp2 = [];

                var chartDataSource_tempL = [];
                var chartDataSource_tempL1 = [];
                var chartDataSource_tempL2 = [];
                var chartDataSource_tempL3 = [];

                var co2Fields = ['ECo2', 'GCo2'];
                var co2FieldsL = ['ECo2Last', 'GCo2Last'];

                var RA = [];
                RA.push(electricityArray);
                RA.push(gasArray);
                RA.push(waterArray);

                _.each(RA, function (array, i) {
                    var field = co2Fields[i];
                    _.each(array[0], function (x) {

                        var data = {
                            //DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()),
                            DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()) + '(' + dday[moment(x.DateTime).toDate().getDay()] + ')',
                        };
                        data[field] = calculate(x.Value, fuelTypes[i]);
                        chartDataSource.push(data);

                        //var fieldL = co2FieldsL[i];
                        var dataL = {
                            DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()) + '(' + dday[moment(x.DateTime).toDate().getDay()] + ')',
                        };
                        //dataL[fieldL] = calculate(x.Value, fuelTypes[i]);
                        chartDataSourceLast.push(dataL);
                    });
                });

                //  2017.11.29 : 그리드 도표 작업 : 팝업창 추가
                _.each(electricityArray[0], function (x) {
                    chartDataSource_temp.push({
                        DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()) + '(' + dday[moment(x.DateTime).toDate().getDay()] + ')',
                        'ECo2': calculate(x.Value, 1)
                    });
                });
                _.each(gasArray[0], function (x) {
                    chartDataSource_temp1.push({
                        DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()) + '(' + dday[moment(x.DateTime).toDate().getDay()] + ')',
                        'GCo2': calculate(x.Value, 2)
                    });
                });

                // 배열을 하나로 합치자            
                var array_length_size = Math.max(chartDataSource_temp.length, chartDataSource_temp1.length);
                // 크기가 동일한 경우에만 허용함 (예외 방어용)
                if (chartDataSource_temp.length == chartDataSource_temp1.length) {
                    for (var i = 0; i < array_length_size; i++) {
                        chartDataSource_temp2.push(
                            {
                                DateTime: chartDataSource_temp[i].DateTime,
                                'ECo2': chartDataSource_temp[i].ECo2,
                                'GCo2': chartDataSource_temp1[i].GCo2
                            });
                    }
                }
                //  2017.11.29 : 그리드 도표 작업 : 팝업창 추가
                var RALast = [];
                RALast.push(electricityArrayL);
                RALast.push(gasArrayL);
                RALast.push(waterArrayL);

                var index = 0;
                //_.each(arguments, function (array, i) {
                _.each(RALast, function (array, i) {
                    var fieldL = co2FieldsL[i];
                    _.each(array[0], function (x) {
                        var dataL = {
                            DateTime: chartDataSourceLast[index].DateTime,
                        };
                        dataL[fieldL] = calculate(x.Value, fuelTypes[i]);
                        chartDataSource.push(dataL);
                        index++;
                    });
                });

                //  2017.11.29 : 그리드 도표 작업 : 팝업창 추가
                _.each(electricityArray[0], function (x, i) {
                    chartDataSource_tempL.push({
                        DateTime: chartDataSourceLast[i].DateTime,
                        'ECo2Last': calculate(x.Value, 1)
                    });
                });
                _.each(gasArray[0], function (x, i) {
                    chartDataSource_tempL1.push({
                        DateTime: chartDataSourceLast[i].DateTime,
                        'GCo2Last': calculate(x.Value, 2)
                    });
                });

                // 배열을 하나로 합치자            
                var array_length_size = Math.max(chartDataSource_tempL.length, chartDataSource_tempL1.length);
                // 크기가 동일한 경우에만 허용함 (예외 방어용)
                if (chartDataSource_tempL.length == chartDataSource_tempL1.length) {
                    for (var i = 0; i < array_length_size; i++) {
                        chartDataSource_tempL2.push(
                            {
                                DateTime1: chartDataSource_tempL[i].DateTime,
                                'ECo2Last': chartDataSource_tempL[i].ECo2Last,
                                'GCo2Last': chartDataSource_tempL1[i].GCo2Last
                            });
                    }
                }

                var array_length_size = Math.max(chartDataSource_temp2.length, chartDataSource_tempL2.length);
                // 크기가 동일한 경우에만 허용함 (예외 방어용)
                if (chartDataSource_temp2.length == chartDataSource_tempL2.length) {
                    for (var i = 0; i < array_length_size; i++) {
                        chartDataSource_tempL3.push(
                            {
                                DateTime: chartDataSource_temp2[i].DateTime,
                                'ECo2': chartDataSource_temp2[i].ECo2,
                                'GCo2': chartDataSource_temp2[i].GCo2,
                                DateTime1: chartDataSource_tempL2[i].DateTime1,
                                'ECo2Last': chartDataSource_tempL2[i].ECo2Last,
                                'GCo2Last': chartDataSource_tempL2[i].GCo2Last
                            });
                    }
                }
                dataArrayresult1 = chartDataSource_tempL3;
                //  2017.11.29 : 그리드 도표 작업 : 팝업창 추가

                //chart().option('argumentAxis', null); // 2015 05 21 결국 이 코드가 필요 함 (시간 축 에러 해결)
                //chartDataSource.concat(chartDataSourceLast);
                options.dataSource = chartDataSource;
                chart().option(options);
                visiblePopup(false);
            })
            .fail(function (error) {
                visiblePopup(false);
            });
        }
        else {
            var promises = [];
            promises.push(request(fuelTypeId, timeType)(date.startDate, date.endDate)); // 현재
            promises.push(request(fuelTypeId, timeType)(dateLast.startDate, dateLast.endDate)); // 1년전

            //request(fuelTypeId, timeType)(date.startDate, date.endDate)
            $.when.apply(this, promises)
            .done(function (dataArray, dataArray2) {
                var dday = new Array('일', '월', '화', '수', '목', '금', '토');
                var chartDataSource = [];
                var DataArray_temp = [];
                var DataArray_temp1 = [];
                var DataArray_temp2 = [];

                //var i = 0;
                //_.map(dataArray[0], function (x) {
                _.each(dataArray[0], function (x, i) {
                    var data = {
                        DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()) + '(' + dday[moment(x.DateTime).toDate().getDay()] + ')',
                        //DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()) + '(' + dday[x.DateTime.getDay()] + ')',
                        Value: x.Value
                    }
                    DataArray_temp.push({
                        DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()) + '(' + dday[moment(x.DateTime).toDate().getDay()] + ')',
                        Value: x.Value
                    });
                    chartDataSource.push(data);
                    var data2 = {
                        DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()) + '(' + dday[moment(x.DateTime).toDate().getDay()] + ')',
                        //DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()) + '(' + dday[x.DateTime.getDay()] + ')',
                        ValueLast: (dataArray2[0].length != 0 && dataArray2[0].length - 1 >= i) ? dataArray2[0][i].Value : 0
                        //ValueLast:  0
                    }
                    DataArray_temp1.push({
                        DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()) + '(' + dday[moment(x.DateTime).toDate().getDay()] + ')',
                        ValueLast: (dataArray2[0].length != 0 && dataArray2[0].length - 1 >= i) ? dataArray2[0][i].Value : 0
                    });
                    chartDataSource.push(data2);
                    //i++;
                    //return x;
                });

                ////  2017.11.27: 그리드 도표 작업 : 팝업창 추가
                //_.each(dataArray[0], function (x, i) {
                //    DataArray_temp.push({
                //        DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()) + '(' + dday[moment(x.DateTime).toDate().getDay()] + ')',
                //        Value: x.Value
                //    });
                //    DataArray_temp1.push({
                //        DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()) + '(' + dday[moment(x.DateTime).toDate().getDay()] + ')',
                //        ValueLast: (dataArray2[0].length != 0 && dataArray2[0].length - 1 >= i) ? dataArray2[0][i].Value : 0
                //    });
                //});
                //_.each(dataArray[0], function (x) {

                //});
                // 배열을 하나로 합치자            
                var array_length_size = Math.max(DataArray_temp.length, DataArray_temp1.length);
                // 크기가 동일한 경우에만 허용함 (예외 방어용)
                if (DataArray_temp.length == DataArray_temp1.length) {
                    for (var i = 0; i < array_length_size; i++) {
                        DataArray_temp2.push(
                            {
                                DateTime: DataArray_temp[i].DateTime,
                                Value: DataArray_temp[i].Value,
                                DateTime1: DataArray_temp1[i].DateTime,
                                ValueLast: DataArray_temp1[i].ValueLast
                            });
                    }
                }
                dataArrayresult = DataArray_temp2;
                //  2017.11.27: 그리드 도표 작업 : 팝업창 추가

                if (chartDataSource.length == 0)
                    //errorMessage.message = '조회된 결과가 없습니다.';
                    utils.toast.show('데이터가 없습니다.');
                else {
                    //chart().option('argumentAxis', null); // 2015 05 21 결국 이 코드가 필요 함 (시간 축 에러 해결)
                    options.dataSource = chartDataSource;
                    chart().option(options);
                }
                visiblePopup(false);
            })
            .fail(function (error) {
                visiblePopup(false);
            });
        }
    }
    //  2017.11.27: 그리드 도표 작업 : 팝업창 추가
    function DataGridPopup_ButtonClick() {
        if (fuelTypeIdForSearch() == CO2)
            DataGridPopup_Visible1(true);
        else
            DataGridPopup_Visible(true);
    }
    function handlePopupShown() {

        // 컬럼명 업데이트
        var ColumnCaptionName = "";
        switch (fuelTypeIdForSearch()) {
            case $Code.FuelType.ELECTRICITY:
                ColumnCaptionName = "전기";
                viewModel.DayYearAnalysisDataGridOptions.columns[1].caption = ColumnCaptionName;
                viewModel.DayYearAnalysisDataGridOptions.columns[3].caption = ColumnCaptionName;
                $("#DayYearAnalysisDataGrid_Container").dxDataGrid("instance").option("dataSource", dataArrayresult);
                DataGridPopup_Visible(true);
                break;
            case CO2:
                ColumnCaptionName = "CO2";
                $("#DayYearAnalysisDataGrid_Container1").dxDataGrid("instance").option("dataSource", dataArrayresult1);
                DataGridPopup_Visible1(true)
                break;
            case $Code.FuelType.GAS:
                ColumnCaptionName = "가스";
                viewModel.DayYearAnalysisDataGridOptions.columns[1].caption = ColumnCaptionName;
                viewModel.DayYearAnalysisDataGridOptions.columns[3].caption = ColumnCaptionName;
                $("#DayYearAnalysisDataGrid_Container").dxDataGrid("instance").option("dataSource", dataArrayresult);
                DataGridPopup_Visible(true);
                break;
            case $Code.FuelType.WATER:
                ColumnCaptionName = "수도";
                viewModel.DayYearAnalysisDataGridOptions.columns[1].caption = ColumnCaptionName;
                viewModel.DayYearAnalysisDataGridOptions.columns[3].caption = ColumnCaptionName;
                $("#DayYearAnalysisDataGrid_Container").dxDataGrid("instance").option("dataSource", dataArrayresult);
                DataGridPopup_Visible(true);
                break;
        }
    }
    //  2017.11.27: 그리드 도표 작업 : 팝업창 추가

    var viewModel = $.extend(BWA.CommonView.create(params, viewInfo, searchViewOptions, ko.observable(null), handleViewShown, null, handleSearchInSearchView), {
        refreshList: refreshList,
        viewHidden: handleViewHidden, // hcLee 2015 03 23
        viewShowing: handleViewShowing,
        DayYearAnalysisDataGridPopup_ButtonClicked: DataGridPopup_ButtonClick
    });

    //  2017.11.27: 그리드 도표 작업 : 팝업창 추가
    // 그래프 도표 팝업창 
    viewModel.DayYearAnalysisDataGridPopupOptions = {
        width: '480px',
        height: '750px', // cyim 2017.05.30 : 테스트 결과 Devextreme 버그임. px 로 지정하면 초기 출력시 정확하게 가운데에 있지만, auto 설정시 화면아래에 위치하게 됨
        contentTemplate: "content",
        showTitle: true,
        title: "도표",
        visible: DataGridPopup_Visible,
        dragEnabled: true,
        closeOnOutsideClick: true,
        shownAction: handlePopupShown,
        animation: window.utils.popup.createAnimation()
    };

    viewModel.DayYearAnalysisDataGridPopupOptions1 = {
        width: '700px',
        height: '750px', // cyim 2017.05.30 : 테스트 결과 Devextreme 버그임. px 로 지정하면 초기 출력시 정확하게 가운데에 있지만, auto 설정시 화면아래에 위치하게 됨
        contentTemplate: "content",
        showTitle: true,
        title: "도표",
        visible: DataGridPopup_Visible1,
        dragEnabled: true,
        closeOnOutsideClick: true,
        shownAction: handlePopupShown,
        animation: window.utils.popup.createAnimation()
    };

    //  2017.11.27: 그리드 도표 작업 : 팝업창 추가
    viewModel.timeBoxForSearch = timeBoxForSearch;
    viewModel.popupOptions = {
        width: 300,
        height: 160,
        contentTemplate: "info",
        showTitle: false,
        title: "메세지",
        visible: visiblePopup,
        dragEnabled: false,
        shading: false,
        closeOnOutsideClick: false
    };

    //  2017.11.27: 그리드 도표 작업 : 팝업창 추가
    viewModel.DayYearAnalysisDataGridOptions = {
        dataSource: dataArrayresult,
        paging: { pageSize: 17 },
        columns: [
            { dataField: 'DateTime', caption: "올해", width: '25%', alignment: 'center', },// dataType: 'date', format: 'yyyy-MM-dd HH:mm' },            
            { dataField: 'Value', width: '25%', alignment: 'center', format: 'fixedPoint', precision: 2 },
            { dataField: 'DateTime1', caption: "작년", width: '25%', alignment: 'center', format: 'fixedPoint', precision: 2 },
            { dataField: 'ValueLast', width: '25%', alignment: 'center', format: 'fixedPoint', precision: 2 }
        ],
        "export": {
            enabled: true,
            fileName: '일자별에너지증감분석'
        }
    };
    viewModel.DayYearAnalysisDataGridOptions1 = {
        dataSource: dataArrayresult1,
        paging: { pageSize: 17 },
        columns: [
            { dataField: 'DateTime', caption: "올해", width: '16%', alignment: 'center', },// dataType: 'date', format: 'yyyy-MM-dd HH:mm' },            
            { dataField: 'ECo2', caption: "전력 CO2", width: '16%', alignment: 'center', format: 'fixedPoint', precision: 2 },
            { dataField: 'GCo2', caption: "가스 CO2", width: '16%', alignment: 'center', format: 'fixedPoint', precision: 2 },
            { dataField: 'DateTime1', caption: "작년", width: '16%', alignment: 'center', },
            { dataField: 'ECo2Last', caption: "전력 CO2", width: '16%', alignment: 'center', format: 'fixedPoint', precision: 2 },
            { dataField: 'GCo2Last', caption: "가스 CO2", width: '16%', alignment: 'center', format: 'fixedPoint', precision: 2 }
        ],
        "export": {
            enabled: true,
            fileName: '일자별에너지증감분석'
        }
    };
    //  2017.11.27: 그리드 도표 작업 : 팝업창 추가
    return viewModel;
};