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

    var CompanyInfo = ko.observableArray();
    var CmCompanyDataSource = BemsWebApplication.db.createDataSource('CmCompany');
    var RowName, RowCompanyId;

    var companyTypeDataSource = BemsWebApplication.db.createDataSource( 'CmCompanyType', true );
    var companyTypes = ko.observableArray();
    var searchCompanyTypes = ko.observableArray();
    var companyTypeDeferred = new $.Deferred();

    var viewModel = BWA.DataGrid.createViewWithDataGrid( params, viewInfo, 'CmCompany', {

        dataSourceOptions: {
            select: [ 'SiteId', 'CompanyTypeId', 'CompanyId', 'Name', 'RepresentativeName', 'PhoneNo', 'IsUse', 'CmCompanyType/Name' ],
            expand: ["CmCompanyType"],
            extendOptions: {
                forceOriginalField: true
            }
        },
        columns: [
            { dataField: 'CompanyId', caption: '번호', width: '10%', alignment: 'center' , sortOrder: 'desc'},
            { dataField: 'CmCompanyType/Name', caption: $G('companyType'), width: '15%', alignment: 'center' },
            { dataField: 'Name', caption: $G( 'companyName' ), width: '35%', alignment: 'center' },
            { dataField: 'RepresentativeName', caption: $G( 'companyRepresentativeName' ), width: '15%', alignment: 'center' },
            { dataField: 'PhoneNo', caption: $G( 'companyPhoneNo' ), width: '15%', alignment: 'center' },
            utils.datagrid.columnIsUse( '10%' )
        ],
        searchViewItems: [{ id: 'CompanyTypeId', ignoreValue: 0, defaultValue: 0, dataSource: searchCompanyTypes }, { id: 'Name' }],
        promiseDataInSearchView: companyTypeDeferred.promise(),

        handleViewShowing: function (that) {
            //2015 11 12 hcLee 필터추가
            companyTypeDataSource.filter([
                ['SiteId', '=', BWA.UserInfo.SiteId()],
                'and',
                ['IsUse', '=', true]
            ]);
            companyTypeDataSource.load().done( function( result ) {
                companyTypes( result );
                searchCompanyTypes( [ { CompanyTypeId: 0, Name: $G('selectAll') } ].concat( result ) );
                companyTypeDeferred.resolve();
            });                
        },

        handleDataGridRowClick: function (id, dataGrid, clickRow, popupVisible) {
            dataGrid.clearSelection();
            viewModel.isNewInPopup(false); // hcLee 2016 02 16 키필드가 콤보로 제공될때 등록시만 보이고 수정시에는 안보기에 하기 위하여 꼭 필요 !!!
            var data = clickRow.data;
            RowName = data.Name;
            RowCompanyId = data.CompanyTypeId;

            popupVisible(true);
        },

        // 이름 중복 방지
        handlePopupShowing: function () {

            CmCompanyDataSource.filter([
                ["SiteId", "=", BWA.UserInfo.SiteId()]
            ]);
            CmCompanyDataSource.load().done(function (result) {
                CompanyInfo(result);
            });
        },

        beforeInsertingDataViewModel: function (dataModel, dbModelId) {
            var dfd = $.Deferred();
            var isDuplicated = false;

            for (var i = 0; i < CompanyInfo().length; i++) {
                if (dataModel.Name() == CompanyInfo()[i].Name() && dataModel.CompanyTypeId() == CompanyInfo()[i].CompanyTypeId()) {
                    isDuplicated = true;
                }
            }
            if (!BWA.DataUtil.isValidInputValue(dataModel.Name())) 
                return dfd.resolve(false, '저장 혹은 수정 반드시 필수 입력 정보를 모두 입력하셔야 합니다 (앞뒤공백 허용안함)');
            
            else {
                if (isDuplicated)
                    return dfd.resolve(false, '이미 동일 정보가 존재합니다 (회사 구분, 회사 명칭 확인 필요)');
                else
                    return dfd.resolve(true);
            }
        },
        
        beforeUpdateDataViewModel: function () {
            var isDuplicated = false;
            for (var i = 0; i < CompanyInfo().length; i++) {
                if (viewModel.dataModel.Name() == CompanyInfo()[i].Name() && viewModel.dataModel.CompanyTypeId() == CompanyInfo()[i].CompanyTypeId()
                    && (RowName() != CompanyInfo()[i].Name() || RowCompanyId() != CompanyInfo()[i].CompanyTypeId())) {
                    isDuplicated = true;
                }
            }
            if (!BWA.DataUtil.isValidInputValue(viewModel.dataModel.Name())) {
                utils.toast.show('저장 혹은 수정 반드시 필수 입력 정보를 모두 입력하셔야 합니다 (앞뒤공백 허용안함)', 'error');
                return 0;
            }
            else {
                if (isDuplicated) {
                    utils.toast.show('이미 동일 이름이 존재합니다 (회사 구분, 회사 명칭 확인 필요).', 'error');
                    return 0;
                }
                else
                    return 2;
            }
        }

    });
    var handleSelectBoxCompanyType = function( e ) {
        viewModel.dataModel.CompanyTypeId(e.value);
    };

    viewModel.companyTypeDataSource = companyTypes;
    viewModel.searchCompanyTypes = searchCompanyTypes;
    viewModel.handleSelectBoxCompanyType = handleSelectBoxCompanyType;
    return viewModel;

};