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

    var initialized = false,
        shouldReload = false,
        datagrid = null,
        currentTabIndex = ko.observable(0),
        facilityViewModel = new BWA.CmFacilityViewModel(),
        dataSource;

    var m_Facility;

    var multiViewItems = [{
        template: 'mainCharts'
    }, {
        template: 'subCharts'
    }
    ];

    var searchDeferred = new $.Deferred();

    var facilityClassDataSource = BemsWebApplication.db.createDataSource('FmsFacilityCodeClass');
    var facilityTypeDataSource = BemsWebApplication.db.createDataSource('BemsFacilityType');
    var facilityTypes = ko.observableArray();
    var facilityClasses = [ko.observableArray(), ko.observableArray(), ko.observableArray()];
    var defaultSearchClassArray = $SearchView.createDefaultArray('FacilityClassId');

    var facilityDataSource = BWA.db.createDataSource('CmFacility'),
        facilitiesForSearch = ko.observableArray(),

        facilityCodeForSearch = ko.observable(0);

    //var deferredForSearch = new $.Deferred();
    
    var searchFacilityClasses = [ko.observableArray(), ko.observableArray(), ko.observableArray()],
        searchFacilityClassValues = [ko.observable(), ko.observable(), ko.observable()],
    searchFacilityClassValuesLast = [ko.observable(), ko.observable(), ko.observable()];

    var selectedFacilityDataInSearchParentPopup = ko.observable();

    selectedFacilityDataInSearchParentPopup.subscribe(function (value) {
        viewModel.dataModel.ParentFacilityCode(value.FacilityCode);
        viewModel.dataModel.ParentFacilityName(value.Name);
    });

    var visiblePopup = ko.observable(false);

    var dataCalorie = ko.observableArray(),
        dataAtfw = ko.observableArray(),
        dataTemperatureCalorie = ko.observableArray(),
        dataTemperatureElectricity = ko.observableArray()
    ;

    var runtimeGet = new BWA.Chart.PointHistory_RunTimeGet(BWA.UserInfo.SiteId());
    var timeBoxForSearch = BWA.SearchView.createDateTimeBox($G.TimeTypesForMonthOnly, 'startThisYear');

    var chartDay = BWA.Chart.Instance('chartDay', 'dxChart');
    var chartMonth = BWA.Chart.Instance('chartMonth', 'dxChart');

    var chartLayout = new BWA.ChartLayout({
        divs: [{
            id: 'day',
            chartId: 'chartDay'

        }, {
            id: 'month',
            chartId: 'chartMonth'
        }
        ],
        multiViewOptions: {
            viewIndex: currentTabIndex,
            viewCount: 1
        }
    });

    /*
    var m = moment();
    dataCalorie([
        { DateTime: new Date(m.year(), m.month(), 1), Value: 50 },
        { DateTime: new Date(m.year(), m.month(), 2), Value: 50 },
        { DateTime: new Date(m.year(), m.month(), 3), Value: 60 },
        { DateTime: new Date(m.year(), m.month(), 4), Value: 80 },
        { DateTime: new Date(m.year(), m.month(), 5), Value: 100 },
        { DateTime: new Date(m.year(), m.month(), 6), Value: 40, },
        { DateTime: new Date(m.year(), m.month(), 7), Value: 120 },
        { DateTime: new Date(m.year(), m.month(), 31), Value: 120 }
    ]);*/

    // 추가 2015 04 20 hcLee ->
    var CODE = $Code,
    FuelType = CODE.FuelType,
    FT = CODE.FacilityType,
    FC = CODE.FacilityCode,
    F = CODE.Formula,
    TIT = CODE.TimeIntervalType;
    // 추가 2015 04 20 hcLee  <-

    //dataMonthForBar(dataDayForBar());

    //dataDayForPie([
    //    { FuelTypeName: '전기', Value: 320 },
    //    { FuelTypeName: '가스', Value: 350 },
    //    { FuelTypeName: '수도', Value: 360 },
    //]);
    //dataMonthForPie(dataDayForPie());
    function handleMonthBarPointClick(clickedPoint) {
        var month = clickedPoint.originalArgument;
        //alert(month.length);
        var year = month.substr(0, 4);
        var month = (month.length == 11) ? month.substr(8, 2) : month.substr(8, 1);
        //alert(year);
        //alert(month);
        //return;
        loadDailyEnergyUsage(year,month);
        console.log(month);
    }

    function loadDailyEnergyUsage(year,month) {

        if (m_Facility == null) return;
        var f = m_Facility.toJS();
        facilityViewModel.fromJS(f);

        visiblePopup(true);

        var startDate, endDate;
        var monthMoment;

        if (_.isUndefined(month)) {
            monthMoment = moment(year);
        }
        else {
            monthMoment = moment(year).month(month - 1);
        }
        startDate = monthMoment.startOf('month');
        endDate = monthMoment.clone().endOf('month');

        var promises = [];
        var p = runtimeGet.apiGet({
            //FacilityTypeId: f.FacilityTypeId,
            FacilityCode: f.FacilityCode,
            TimeIntervalType: TIT.DAY,
            StartDate: startDate,
            EndDate: endDate
        });
        promises.push(p);
        promises.push(BemsWebApplication.api.get('BemsMonitoringPointHistory/FacilityCostRunTime', {
            SiteId: BWA.UserInfo.SiteId(),
            FacilityCode: f.FacilityCode,
            TimeIntervalType: TIT.DAY,
            StartDate: $G.dateTime(startDate), // 중요 2016 04 26
            EndDate: $G.dateTime(endDate) // 중요 2016 04 26
        }));

        $.when.apply(this, promises).done(function (sw, cost) {

            var barDataArray = [];
            //var pieDataArray = [];
            //getChartDataFromDataSources(arguments, barDataArray, pieDataArray, 'D');
            _.each(sw[0][0], function (x) {
                barDataArray.push({
                    DateTime: moment(x.DateTime).format('D'),
                    rt: x.Value
                    });
            });
            _.each(cost[0], function (x) {
                barDataArray.push({
                    DateTime: moment(x.DateTime).format('D'),
                    cost: Math.round(x.Value)
                });
            });

            /*
            var remainDate = _.range(moment().date(), moment().endOf('month').date() + 1);
            _.each(remainDate, function (date) {
                barDataArray.push({
                    DateTime: date,
                    rt : 0,
                });
            });*/
            //console.log(barDataArray);

            //2015 11 23 차트 다시 그리지 않는 문제 
            //chartDay().option('dataSource', barDataArray); 대신 아래3줄로 변경
            var options = BWA.ChartOptions.FacilityRuntime.getChartDayOptions($Code.TimeType.DAY);
            options.dataSource = barDataArray;
            chartDay().option(options);

            
            $('#st1').text(year + '년 ' + month + '월 가동시간  ' + ' : ' + f.Name);
            $('#st2').text('월별 가동시간  ' + ' : ' + f.Name);

            /*$('#st1').text(monthMoment._d.getMonth() + 1 + '월 TOE환산 에너지 사용 현황');
            $('#st2').text(monthMoment._d.getMonth() + 1 + '월 TOE환산 에너지 전체 사용량 비율');
            $('#st3').text(monthMoment._d.getMonth() + 1 + '월 TOE환산 에너지 사용량');

            $('#st4').text(new Date().getFullYear() + '년 TOE환산 에너지 사용 현황');
            $('#st5').text(new Date().getFullYear() + '년 TOE환산 에너지 전체 사용량 비율');
            $('#st6').text(new Date().getFullYear() + '년 TOE환산 에너지 사용량');*/

            visiblePopup(false);

        }).fail(function (error) {
            //alert(error);
            visiblePopup(false);
        });

    }



    function handleViewShown() {

        if (initialized === false) {

            var chartOption = BWA.ChartOptions.FacilityRuntime;

            chartDay = chartDay(chartOption.getChartDayOptions($Code.TimeType.DAY));
            //chartMonth = chartMonth(chartOption.getChartMonthOptions($Code.TimeType.MONTH));
            chartMonth = chartMonth(chartOption.getChartMonthOptions($Code.TimeType.MONTH, handleMonthBarPointClick));

            initialized = true;
        }


        facilityClassDataSource.filter([
                ['SiteId', '=', BWA.UserInfo.SiteId()],
                'and',
                ['ParentFacilityClassId', '=', null]
        ]);

        facilityTypeDataSource.filter([
            ['FacilityTypeId', '<', 99],
            //'and',
            //['ContractType', '>', 0]
        ]);

        // 빌딩 데이터 로드 시점 
        $.when(facilityClassDataSource.load(),
            //buildingDataSource.load(),
            facilityTypeDataSource.load()
        //).done(function (result1, result2, result3) {
        ).done(function (result1, result2) {

            facilityClasses[0](result1[0]);
            searchFacilityClasses[0](defaultSearchClassArray.slice(0).concat(result1[0]));
            searchFacilityClassValues[0](0);
            //searchFacilityClasses[0](defaultSearchClassArray.slice(0));
            initializeSearchClasses();

            //buildings(result2[0]);
            //searchBuildings(defaultSearchBuildingArray.slice(0).concat(result2[0]));
            //searchFloors(defaultSearchFloorArray.slice(0));

            facilityTypes(result2[0]);

            searchDeferred.resolve();



        });
/*
        var eq = BWA.DataUtil.constructEqualFilter;
        facilityDataSource.filter([
            eq('SiteId', BWA.UserInfo.SiteId()),
        ]);
        facilityDataSource.load().done(function (facilities) {
            facilitiesForSearch(facilities);
            if (_.isEmpty(facilities) === false) {
                var f = facilities[0];
                handleSelectedFacilityInSearchView(f);
                handleSearchInSearchView();
                var datagrid = $('#FacilityDataGridViewInSearchView').dxDataGrid('instance');
                if (_.has(datagrid, 'selectRows')) {
                    datagrid.selectRows(f);
                }
            }
        });*/
    }

    if (shouldReload) {
        //shouldReload = false;
        //dataSource.pageIndex(0);
        //dataSource.load();
    }

    function handleViewHidden() {
        var paging = BWA.ChartLayout.Paging;
        paging.sideOverlayVisible(false);
        $SearchView.visibleObservable(false); // hcLee 2015 03 23
        visiblePopup(false);
    }

    function handleViewShowing() {
    }

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

    function ReSetSearchList() {
        if (searchFacilityClassValues[0]() == null || searchFacilityClassValues[1]() == null || searchFacilityClassValues[2]() == null) return;

        if (searchFacilityClassValuesLast[0]() == searchFacilityClassValues[0]() &&
            searchFacilityClassValuesLast[1]() == searchFacilityClassValues[1]() &&
            searchFacilityClassValuesLast[2]() == searchFacilityClassValues[2]()) return;

        searchFacilityClassValuesLast[0](searchFacilityClassValues[0]());
        searchFacilityClassValuesLast[1](searchFacilityClassValues[1]());
        searchFacilityClassValuesLast[2](searchFacilityClassValues[2]());

        var filterA = [];
        var eq = BWA.DataUtil.constructEqualFilter;
        
        filterA.push(eq('SiteId', BWA.UserInfo.SiteId()));
        filterA.push(['ContractType', '>', 0]);

        if (searchFacilityClassValues[0]() != 0) {
            filterA.push(eq('FirstClassId', searchFacilityClassValues[0]()));
        }
        if (searchFacilityClassValues[1]() != 0) {
            filterA.push(eq('SecondClassId', searchFacilityClassValues[1]()));
        }
        if (searchFacilityClassValues[2]() != 0) {
            filterA.push(eq('ThirdClassId', searchFacilityClassValues[2]()));
        }

        facilityDataSource.filter(filterA);
        facilityDataSource.load().done(function (facilities) {
            facilitiesForSearch(facilities);
            if (_.isEmpty(facilities) === false) {
                var f = facilities[0];
                handleSelectedFacilityInSearchView(f);
                handleSearchInSearchView();
                var datagrid = $('#FacilityDataGridViewInSearchView').dxDataGrid('instance');
                if (_.has(datagrid, 'selectRows')) {
                    datagrid.selectRows(f);
                }
            }
        });
    }

    var handleFirstClassChangedValueInSearchView = function (e) {
        if (e.value === 0) {
            initializeSearchClasses();
            return;
        }
        BWA.DataUtil.setArrayDataSourceFilter(facilityClassDataSource, 'ParentFacilityClassId', e.value, searchFacilityClasses[1], defaultSearchClassArray);
        searchFacilityClassValues[1](0);

        ReSetSearchList();
    };

    var handleSecondClassChangedValueInSearchView = function (e) {
        if (e.value === 0) {
            initializeSearchClasses(true);
            return;
        }
        BWA.DataUtil.setArrayDataSourceFilter(facilityClassDataSource, 'ParentFacilityClassId', e.value, searchFacilityClasses[2], defaultSearchClassArray);
        searchFacilityClassValues[2](0);

        ReSetSearchList();

    };

    var handleThirdClassChangedValueInSearchView = function (e) {
        /*if (e.value === 0) {
            return;
        }*/
        ReSetSearchList();
    };

    function initializeSearchClasses(onlyThird) {
        if (onlyThird === undefined || onlyThird === false) {
            searchFacilityClasses[1](defaultSearchClassArray.slice(0));
            searchFacilityClassValues[1](0);
        }
        searchFacilityClasses[2](defaultSearchClassArray.slice(0));
        searchFacilityClassValues[2](0);

        ReSetSearchList();
    }

    var searchViewOptions = {
        searchViewItems: [
            { id: 'FirstClassId', ignoreValue: 0, defaultValue: 0, value: searchFacilityClassValues[0], dataSource: searchFacilityClasses[0], handleChangedValue: handleFirstClassChangedValueInSearchView },
            { id: 'SecondClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FirstClassId', value: searchFacilityClassValues[1], dataSource: searchFacilityClasses[1], handleChangedValue: handleSecondClassChangedValueInSearchView },
            { id: 'ThirdClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FirstClassId', value: searchFacilityClassValues[2], dataSource: searchFacilityClasses[2], handleChangedValue: handleThirdClassChangedValueInSearchView },
            { id: 'FacilityCode', ignoreValue: 0, defaultValue: 0, value: facilityCodeForSearch, dataSource: facilitiesForSearch },
        ],
        promiseDataInSearchView: searchDeferred.promise()
    };


    function handleSelectedFacilityInSearchView(facility) {

        m_Facility = facility;
        return;

    }

    function handleSearchInSearchView(filter, searchViewItems) {

        if (m_Facility == null) return;

        //alert(m_Facility.Name());
        var f = m_Facility.toJS();
        facilityViewModel.fromJS(f);

        //var timeIntervalType = $Code.TimeIntervalType.QUARTERMIN;
        var timeIntervalType = timeBoxForSearch.type();
        var formula = $Code.Formula[$Code.FacilityType.WATER_H];
        var formulaIds = _.values(formula);

        var date = timeBoxForSearch.getDate();

        //utils.toast.displayTime=1000000;
        //utils.toast.show('공조기 성능분석 중 입니다. 잠시만 기다려 주세요');

        visiblePopup(true);
        //        var startDate = moment().
        var promises = [];
        var p = runtimeGet.apiGet({
                //FacilityTypeId: f.FacilityTypeId,
                FacilityCode: f.FacilityCode,
                TimeIntervalType: timeIntervalType,
                StartDate: date.startDate,
                EndDate: date.endDate
        });
        promises.push(p);
        promises.push(BemsWebApplication.api.get('BemsMonitoringPointHistory/FacilityCostRunTime', {
            SiteId:BWA.UserInfo.SiteId(),
            FacilityCode: f.FacilityCode,
            TimeIntervalType: timeIntervalType,
            StartDate: $G.dateTime(date.startDate), // 중요 2016 04 26
            EndDate: $G.dateTime(date.endDate) // 중요 2016 04 26
        }));
        //BemsWebApplication.api.get('AvailableDueDate/GetAvailableDueDate', commonParameters).done(function (values) {
            
        $.when.apply(this, promises).done(function (sw, cost) {
            //var sw = sw[0];
            //var cost = cost[0];

            var MonthDataArray = [];
            _.each(sw[0][0], function (x) {
                MonthDataArray.push({
                    DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()),
                    //DateTime: moment(x.DateTime).format('M'),
                    rt: x.Value
                });
            });

            _.each(cost[0], function (x) {
                MonthDataArray.push({
                    DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()),
                    //DateTime: moment(x.DateTime).format('M'),
                    cost: Math.round(x.Value)
                });
            });

            //var options = BWA.ChartOptions.FacilityRuntime.getChartMonthOptions(timeBoxForSearch.type(), handleMonthBarPointClick);
            //options.dataSource = MonthDataArray;
            //chartMonth().option(options);

            //2015 11 23 차트 다시 그리지 않는 문제 
            //chartMonth().option('dataSource', MonthDataArray); 대신 아래3줄로 변경
            var options = BWA.ChartOptions.FacilityRuntime.getChartMonthOptions($Code.TimeType.MONTH, handleMonthBarPointClick);
            options.dataSource = MonthDataArray;
            chartMonth().option(options);

            loadDailyEnergyUsage(date.endDate.getFullYear().toString(), (date.endDate.getMonth() + 1).toString());
            //loadDailyEnergyUsage("2015", "11");
            //hw = hw[0];

            // chart 1
            /*
            var EffiDataArray = [];
            _.each(sw, function (x) {
                EffiDataArray.push({
                    DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()),
                    sw: x.Value
                });
            });
            _.each(hw, function (x) {
                EffiDataArray.push({
                    DateTime: BWA.Chart.getCustermTimeArgumentAxisString(timeBoxForSearch.type(), moment(x.DateTime).toDate()),
                    hw: x.Value
                });
            });
            var options = BWA.ChartOptions.WaterHAnalysis.getChartEffiOptions(timeBoxForSearch.type());
            options.dataSource = EffiDataArray;
            chartEffi().option(options);
            */
            //visiblePopup(false);

        })
        .fail(function (error) {
            //alert(error);
            visiblePopup(false);
        });

    }

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

                //        facility: facilityViewModel,
                refreshList: refreshList,
                viewHidden: handleViewHidden, // hcLee 2015 06 03
                viewShowing: handleViewShowing,

                /*
                searchViewItems: [
                    { id: 'FirstClassId', ignoreValue: 0, defaultValue: 0, value: searchFacilityClassValues[0], dataSource: searchFacilityClasses[0], handleChangedValue: handleFirstClassChangedValueInSearchView },
                    { id: 'SecondClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FirstClassId', value: searchFacilityClassValues[1], dataSource: searchFacilityClasses[1], handleChangedValue: handleSecondClassChangedValueInSearchView },
                    { id: 'ThirdClassId', ignoreValue: 0, defaultValue: 0, withCheckId: 'FirstClassId', value: searchFacilityClassValues[2], dataSource: searchFacilityClasses[2] },
                    { id: 'FacilityCode', ignoreValue: 0, defaultValue: 0, value: facilityCodeForSearch, dataSource: facilitiesForSearch },
                ],
                promiseDataInSearchView: searchDeferred.promise(),*/

                scrolling: { mode: 'infinite' },
                FacilityDataGridOptions: {
                    dataSource: facilitiesForSearch,
                    columns: [
                        { dataField: 'Name', caption: $G('facilityName'), width: '100%', alignment: 'left' }
                    ],
                    filterRow: {
                        visible: true,
                        showOperationChooser: false
                    },
                    selection: {
                        mode: 'single'
                    },
                    rowClick: function (clickRow) {
                        handleSelectedFacilityInSearchView(clickRow.data);
                    }
                },
                contentReadyAction: function (e) {
                    datagrid = e.component;
                }
            });
    /*
    viewModel.popupOptions = {
        width: 300,
        height: 100,
        contentTemplate: "info",
        showTitle: false,
        title: "메세지",
        visible: visiblePopup,
        dragEnabled: false,
        shading: false,
        closeOnOutsideClick: false
    };
    */
    //viewModel.dataModel.MainContactorUserName = $KoSet(viewModel.dataModel.MainContactorUserName, '');
    //viewModel.dataModel.SubContactorUserName = $KoSet(viewModel.dataModel.SubContactorUserName, '');
    //viewModel.dataModel.ParentFacilityName = $KoSet(viewModel.dataModel.ParentFacilityName, '');

    viewModel.facilityTypes = facilityTypes;
    //viewModel.dataModel.ClassName = ko.observable();
    viewModel.facilityClasses = facilityClasses;
    viewModel.searchFacilityClasses = searchFacilityClasses;
    viewModel.facilitySearchPopup = BWA.Popup.Facility.create(viewModel, selectedFacilityDataInSearchParentPopup);
    viewModel.timeBoxForSearch = timeBoxForSearch;
    viewModel.currentTabIndex = currentTabIndex;
    viewModel.multiViewItems = [{
        facility: facilityViewModel,
        template: 'mainCharts'
    }, {
        template: 'subCharts'
    }
    ];

    $HourGlassPopup(viewModel, visiblePopup);

    return viewModel;
};