infrastructureModule
.controller('ProjectManageController', ['$scope', '$log', '$timeout', '$translate', 'projectService', 'userService', 'uiGridConstants', 'SweetAlert', 'orgService', 'roleService', 'templateGroupService',
    function ($scope, $log, $timeout, $translate, projectService, userService, uiGridConstants, SweetAlert, orgService, roleService, templateGroupService) {
        'use strict';

        var testModuleList = [{ id: '1', name: '2016' }, { id: '1', name: '2017' }];


        var loadProjectIndustryList = function () {
            orgService.getProjectIndustrys().success(function (data) {

                $scope.projectIndustryList = data;
            });
        };

        var loadAllTemplate = function () {
            templateGroupService.getall().success(function (data) {
                $scope.templateGroupList = data;
            });
        };

        var getTemplate = function (serviceTypeId) {

            return _.filter($scope.templateGroupList, function (num) { return num.serviceTypeID === serviceTypeId });
        };

        var initServiceList = function () {
            projectService.getServiceList().success(function (serviceListData) {
                $scope.serviceList = serviceListData;
                // $timeout(function () {
                //     initMultipleSelect();
                // }, 10);

                $scope.projectModuleList = [];
                $scope.newProjectModuleRow();
            });
        };

        $scope.newProjectModuleRow = function () {

            if ($scope.serviceList.length <= $scope.projectModuleList.length) {
                return;
            }

            var serviceList = copyArray($scope.serviceList);

            var row = {
                serviceList: serviceList,
                moduleList: [],
                selectedService: null,
                selectedModule: null
            };

            $scope.projectModuleList.push(row);
        };

        var setProjectModuleRowList = function (projectData) {
            $scope.projectModuleList = [];
            if ($scope.serviceList.length <= $scope.projectModuleList.length) {
                return;
            }

            if (projectData.serviceTypeTemplateGroupList && projectData.serviceTypeTemplateGroupList.length > 0) {
                projectData.serviceTypeTemplateGroupList.forEach(function (row) {
                    var serviceList = copyArray($scope.serviceList);

                    var moduleList = getTemplate(row.serviceTypeID);

                    var row = {
                        projectServiceTypeID: row.projectServiceTypeID,
                        serviceList: serviceList,
                        moduleList: moduleList,
                        selectedService: _.find(serviceList, function (num) { return num.id === row.serviceTypeID }),
                        selectedModule: _.find(moduleList, function (num) { return num.id === row.templateGroupID })
                    };

                    $scope.projectModuleList.push(row);
                });
            }
        };

        $scope.changeProjectService = function (projectModule) {

            var moduleList = getTemplate(projectModule.selectedService.id);

            projectModule.moduleList = moduleList;
            if (moduleList && moduleList.length > 0) {
                projectModule.selectedModule = moduleList[0];
            } else {
                projectModule.selectedModule = {};
            }
        };

        var copyArray = function (data) {
            var ret = [];
            data.forEach(function (row) {

                ret.push(row);
            });

            return ret;
        };

        $scope.deleteProjectModule = function (model) {
            if (model) {
                $scope.projectModuleList.splice(jQuery.inArray(model, $scope.projectModuleList), 1);
            };
        };

        $scope.getGridHeight = function () {
            return { height: ($(".system-manage #projectDataList").height() - $(".system-manage #projectDataList .project-manage-menu").height()) + "px" };
        }

        var initProjectList = function (orgID, serviceID, projectYear) {

            if (!orgID) {
                orgID = '';
            }

            if (!serviceID) {
                serviceID = '';
            }

            if (!projectYear) {
                projectYear = null;
            }

            projectService.getProjectList(orgID, serviceID, projectYear).success(function (projectListData) {

                if ($scope.projectId && $scope.serviceType) {
                    $log.debug('projectID:' + $scope.projectId + '; serviceType:' + $scope.serviceType);

                    projectListData = _.where(projectListData, {
                        id: $scope.projectId.toLowerCase(), serviceTypeID: parseInt($scope.serviceType)
                    });


                }



                //set index number, ui-grid have no $$index
                var projectIndex = 1;
                var curProject = null;
                projectListData.forEach(function (p) {
                    if (!curProject) {
                        curProject = p;
                        p.index = projectIndex++;
                        p.nameDisplay = p.name;
                        p.organizationNameDisplay = p.organizationName;
                        p.yearDisplay = p.year;
                        p.industryNameDisplay = p.industryName;
                    }
                    else {
                        if (p.id == curProject.id) {
                            p.nameDisplay = '';
                            p.organizationNameDisplay = '';
                            p.yearDisplay = '';
                            p.industryNameDisplay = '';
                        }
                        else {
                            curProject = p;
                            p.index = projectIndex++;
                            p.nameDisplay = p.name;
                            p.organizationNameDisplay = p.organizationName;
                            p.yearDisplay = p.year;
                            p.industryNameDisplay = p.industryName;
                        }
                    }

                });

                $scope.gridOptions.data = projectListData;

                $scope.gridOptions.noData = projectListData.length === 0;
            });
        };

        var initProjectYear = function () {
            var arrYear = '[';
            var curYear = new Date().getFullYear();
            for (var beginYear = curYear - 4; beginYear <= curYear + 4; beginYear++) {
                arrYear += '{"year"' + ':' + beginYear + '},';
            }
            arrYear = arrYear.substring(0, arrYear.length - 1) + ']';
            $scope.projectYearList = JSON.parse(arrYear);
        };


        var newProject = function () {
            $scope.isAdd = true;
            $scope.editProjectModel = {};
            $scope.editProjectModel.serviceSelectedList = [];
            $scope.editProjectModel.serviceSelectedList = [];
            $scope.projectModuleList = [];
            $scope.newProjectModuleRow();
            $scope.selectedIndustry = null;
            $scope.editProjectModel.selectedYear = null;
            $scope.editProjectModel.componentSelectedOrg = null;
            resetErrorStatus();
            $("#selectedOrgName-error").hide();
            $('#addProjectPop').modal('show');
        };

        //save project
        var saveProject = function () {
            if (!($('#projectForm').valid())) {
                return;
            }

            if (!$scope.editProjectModel) {
                return;
            }

            if ($scope.projectModuleList) {
                $scope.editProjectModel.serviceTypeTemplateGroupList = [];

                var iserror = false;
                $scope.projectModuleList.forEach(function (row) {
                    if (row.selectedService && row.selectedService.id && row.selectedModule && row.selectedModule.id && !iserror) {

                        // 先判断是否有一样的了
                        if (_.find($scope.editProjectModel.serviceTypeTemplateGroupList, function (num) { return num.serviceTypeID === row.selectedService.id && num.templateGroupID === row.selectedModule.id })) {

                            if (!iserror) {
                                iserror = true;
                                SweetAlert.warning(row.selectedService.name + '-' + row.selectedModule.name + $translate.instant('HasSelected'));
                            }

                        } else {
                            var serviceTypeTemplateGroup = {};
                            serviceTypeTemplateGroup.serviceTypeID = row.selectedService.id;
                            serviceTypeTemplateGroup.templateGroupID = row.selectedModule.id;
                            if (row.projectServiceTypeID) {
                                serviceTypeTemplateGroup.projectServiceTypeID = row.projectServiceTypeID;
                            }

                            serviceTypeTemplateGroup.serviceTypeName = row.selectedService.name;
                            serviceTypeTemplateGroup.templateGroupName = row.selectedModule.name;
                            $scope.editProjectModel.serviceTypeTemplateGroupList.push(serviceTypeTemplateGroup);
                        }
                    } else {
                        // 服务和模型都必须选择
                        // 这里可以提示
                        if (!iserror) {
                            iserror = true;
                            SweetAlert.warning($translate.instant('SelectBothServiceAndTemplate'));
                        }
                    }
                });

                if (iserror) {
                    return;
                }
            }

            if ($scope.selectedIndustry && $scope.selectedIndustry.id) {
                $scope.editProjectModel.industryID = $scope.selectedIndustry.id;
            }

            if ($scope.isAdd) {
                $scope.editProjectModel.year = $scope.editProjectModel.selectedYear.year;
                $scope.editProjectModel.OrganizationID = $scope.editProjectModel.organizationID;
                projectService.addProject($scope.editProjectModel).success(function (data) {
                    if (data && !data.result) {
                        swal($translate.instant('SaveFail'), $translate.instant(data.resultMsg), 'warning');
                        return;
                    }

                    $log.debug('add success' + projectID);
                    SweetAlert.success($translate.instant('SaveSuccess'));
                    $scope.editProjectModel = {};
                    initProjectList();
                });
            } else {

                if (ischangeProjectService()) {
                    SweetAlert.swal({
                        title: $translate.instant('Confirm') + $translate.instant('Change') + '?',
                        text: $translate.instant('ChangeProjectTips'),
                        type: "warning",
                        showCancelButton: true,
                        confirmButtonColor: "#DD6B55", confirmButtonText: $translate.instant('Confirm'),
                        cancelButtonText: $translate.instant('Cancel'),
                        closeOnConfirm: false,
                        closeOnCancel: true
                    },
                      function (isConfirm) {
                          if (isConfirm) {

                              projectService.updateProject($scope.editProjectModel).success(function (data) {
                                  if (data && !data.result) {
                                      swal($translate.instant('SaveFail'), $translate.instant(data.resultMsg), 'warning');
                                      return;
                                  }

                                  SweetAlert.swal($translate.instant('Confirm') + $translate.instant('Change'), $translate.instant("SaveSuccess"), "success");
                                  $scope.editProjectModel = {};
                                  initProjectList();
                              });
                          }
                      });
                } else {

                    projectService.updateProject($scope.editProjectModel).success(function (data) {
                        if (data && !data.result) {
                            swal($translate.instant('SaveFail'), $translate.instant(data.resultMsg), 'warning');
                            return;
                        }

                        SweetAlert.success($translate.instant('SaveSuccess'));
                        $scope.editProjectModel = {};
                        initProjectList();
                    });

                }
            }
            $('#addProjectPop').modal('hide');
        };

        var ischangeProjectService = function () {

            var ischange = false;
            if ($scope.editProjectModel && $scope.editProjectModel.serviceTypeTemplateGroupList && $scope.currentProjectData && $scope.currentProjectData.serviceTypeTemplateGroupList) {

                $scope.currentProjectData.serviceTypeTemplateGroupList.forEach(function (row) {

                    var updateModel = _.find($scope.editProjectModel.serviceTypeTemplateGroupList, function (num) { return num.id === row.id });
                    if (!updateModel) {
                        ischange = true;
                    }

                    if (updateModel.serviceTypeID != row.serviceTypeID || updateModel.templateGroupID !== row.templateGroupID) {
                        ischange = true;
                    }
                });
            }

            return ischange;
        };

        //load project
        var loadProject = function (projectID) {
            $scope.isAdd = false;
            projectService.getSingleProject(projectID).success(function (projectData) {
                //set ServiceBelong
                $scope.editProjectModel = projectData;

                var first = _.find($scope.projectIndustryList, function (num) { return num.id + '' === $scope.editProjectModel.industryID });
                if (first) {
                    $scope.selectedIndustry = first;
                }

                $scope.currentProjectData = projectData;

                setProjectModuleRowList(projectData);

                //set ProjectYear
                $scope.editProjectModel.selectedYear = _.find($scope.projectYearList, function (num) { return num.year === projectData.year });

                // $scope.selectedIndustry = _.find($scope.projectIndustryList, function (num) { return num.id + '' === projectData.industryID });
            });

            resetErrorStatus();
            $('#addProjectPop').modal('show');
        };

        //Delete project info
        var deleteProject = function () {
            projectService.deleteProject($scope.toDeleteModel).success(function () {
                $('#deleteConfirmPop').modal('hide');
                //Reload project list
                initProjectList();
                $log.debug('delete success!');

            });
        };

        //Deleted projects
        var deleteProjects = function () {
            projectService.deleteProjects($scope.gridApi.selection.getSelectedRows()).success(function () {
                $('#deleteConfirmPop').modal('hide');
                initProjectList();
                $log.debug('delete projects success!');
            });
        };

        //delete project confirm
        var deleteProjectConfirm = function (project) {
            $scope.isMore = false;
            $scope.toDeleteModel = project;
            $scope.toDeleteName = project.projectName;
            $scope.toDeleteCode = project.projectCode;
            $('#deleteConfirmPop').modal('show');
        };

        //delete projects confirm
        var deleteProjectsConfirm = function () {
            if ($scope.gridApi.selection.getSelectedCount() > 0) {
                $scope.isMore = true;
                $('#deleteConfirmPop').modal('show');
            }
            else {
                $log.debug('plese select projects first!');
            }

        };


        var reloadProjectData = function () {
            var orgId = $scope.queryOrgId;
            var serviceId = $scope.queryService;
            var projectId = $scope.queryProjectYear;

            initProjectList(orgId, serviceId, projectId);
        };

        var toggleSub = function (roleNode) {
            if (roleNode.isChecked) {
                $scope.checkedRolesSet[roleNode.roleID] = roleNode;
            }
            else {
                delete $scope.checkedRolesSet[roleNode.roleID];
            }

            $scope.set = _.keys($scope.checkedMenusSet);
            if (!roleNode.subNodeList) {
                return;
            }
            roleNode.subNodeList.forEach(function (d) {
                d.isChecked = roleNode.isChecked;
                if (roleNode.isChecked) {
                    $scope.checkedRolesSet[d.roleID] = d;
                }
                else {
                    delete $scope.checkedRolesSet[d.roleID];
                }
            });

            $scope.set = _.keys($scope.checkedRolesSet);
        };

        var clearRoleIsChecked = function () {

            if ($scope.roleNodeList && $scope.roleNodeList.length > 0) {

                for (var i = $scope.roleNodeList.length - 1; i >= 0; i--) {
                    $scope.roleNodeList[i].isChecked = false;
                    toggleSub($scope.roleNodeList[i]);
                }
            }
        };

        var roleTreeLoad = function () {
            userService.getRoleDisplayList().success(function (roleDisplayTypeData) {

                if (roleDisplayTypeData && roleDisplayTypeData.length > 0) {
                    var group = _.groupBy(roleDisplayTypeData, function (n) { return n.roleTypeId; });

                    var roleNode = [];
                    var roleTypeIdList = [];
                    for (var i = roleDisplayTypeData.length - 1; i >= 0; i--) {
                        roleTypeIdList.push(roleDisplayTypeData[i].roleTypeId);
                    }

                    roleTypeIdList = _.uniq(roleTypeIdList);
                    for (var m = roleTypeIdList.length - 1; m >= 0; m--) {
                        var subList = group[roleTypeIdList[m]];

                        if (subList) {
                            var model = {
                                name: subList[0].roleTypeName,
                                roleTypeName: subList[0].roleTypeName,
                                roleTypeId: subList[0].roleTypeId,
                                description: '',
                                roleID: subList[0].roleTypeId,
                                subNodeList: subList
                            };

                            roleNode.push(model);
                        }
                    }

                    $scope.roleNodeList = roleNode;
                } else {
                    $scope.roleNodeList = [];
                }

            });
        };


        var assignUser = function (projectData) {
            $scope.assignProject = projectData;
            resetSelectedUser($scope.userList);
            $scope.selectUserSpan = {};

            userService.getUserListByProject(projectData.id, projectData.serviceTypeID).success(function (userData) {
                $scope.userList = userData;
                checkUser($scope.userList[0].subUsers[0]);

                $scope.assignUserSet = getUserSet(userData);
                $('#assignUserPop').modal('show');
            });
            roleService.getroletree(projectData.serviceTypeID).success(function (data) {
                $scope.roleTreeData = data;

            });
        };


        var getUserChecked = function (user, chk) {
            if (chk === true) {
                $scope.selectUserIDs += user.userID + ',';
            }
            else {
                $scope.selectUserIDs = $scope.selectUserIDs.replace(',' + user.userID + ',', ',');
            }
            $log.debug($scope.selectUserIDs);
        };

        var findRoleByRoleID = function (roleList, roleId) {

            var ret = _.find(roleList, function (num) {
                return num.roleID + '' === roleId;
            });

            return ret;
        };

        var findAllCheckedList = function (roleList) {
            var checkedList = _.filter(roleList, function (num) {
                return num.isChecked;
            });

            return checkedList;
        };

        var selectNode = function (roleNode) {
            $scope.selectedRole = roleNode;
        };

        var toggle = function (scope) {
            scope.toggle();
        };

        var initMultipleSelect = function () {
            var multiOption = {
                includeSelectAllOption: true,
                selectAllText: $translate.instant('allService'),
                nonSelectedText: $translate.instant('nonSelectedService'),
                allSelectedText: $translate.instant('allService')
            };

            $('#serviceTypeList').show().multiselect(multiOption);
        };

        var search = function () {
            $scope.gridApi.grid.refresh();
        };


        //Initial user list
        var initUser = function () {
            userService.getUserTreeList().success(function (userData) {
                $scope.userList = userData;
                checkUser($scope.userList[0].subUsers[0]);

                $scope.assignUserSet = getUserSet(userData);
            })
        };

        var getUserSet = function (userData) {
            var userSet = [];
            userData.forEach(function (row) {
                row.isSelected = row.isChecked;
                userSet.push(row);

                if (row.subUsers && row.subUsers.length > 0) {
                    var subUserSet = getUserSet(row.subUsers);
                    userSet = _.union(userSet, subUserSet);
                }
            });

            return userSet;
        };

        //select tree node event
        var checkUser = function (user) {

            var isSelected = !user.isSelected;

            // 设置子节点
            setUserRecursion(user, isSelected);

            // 设置父级节点状态
            setParentRecursion(user, isSelected);


        };

        var setUserRoleSetList = function (user) {

            if (!$scope.roleTreeData || $scope.roleTreeData.length === 0) {
                return;
            }

            // 都要设置成不选择
            $scope.roleTreeData[0].isChecked = false;
            $scope.roleTreeData[0].subRoles.forEach(function (row) {
                row.isChecked = false;
            });

            if (!user || !user.id) {
                return;
            }

            userService.getUserRoleSetList(user.id, $scope.assignProject.serviceTypeID, $scope.assignProject.id).success(function (data) {
                if (data && data.length) {
                    data.forEach(function (row) {

                        var filter = _.filter($scope.roleTreeData[0].subRoles, function (num) { return num.id === row.roleID });
                        if (filter && filter.length > 0) {
                            filter.forEach(function (row2) {
                                row2.isChecked = true;
                            });


                        }
                    });

                    var filter = _.filter($scope.roleTreeData[0].subRoles, function (num) { return num.isChecked });
                    if (filter.length === $scope.roleTreeData[0].subRoles.length) {
                        $scope.roleTreeData[0].isChecked = true;
                    }
                }
            });
        };

        var setUserRecursion = function (user, isSelected) {

            user.isSelected = isSelected;
            if (user.subUsers && user.subUsers.length > 0) {
                user.subUsers.forEach(function (row) {
                    setUserRecursion(row, isSelected);
                });
            }
        };

        var setParentRecursion = function (user, isSelected) {
            if (user.parent && user.parent.subUsers && user.parent.subUsers.length > 0) {
                var selectSubUserList = _.filter(user.parent.subUsers, function (num) { return num.isSelected === isSelected });

                if (user.parent.subUsers && selectSubUserList && user.parent.subUsers.length === selectSubUserList.length) {
                    user.parent.isSelected = isSelected;
                } else {
                    user.parent.isSelected = false;
                }

                if (user.parent.parent) {
                    setParentRecursion(user.parent, isSelected);
                }
            }
        };


        var resetSelectedUser = function (userList, parent) {
            userList.forEach(function (row) {
                row.isSelected = false;
                if (parent && !row.parent) {
                    row.parent = parent;
                }

                if (row.subUsers && row.subUsers.length > 0) {

                    resetSelectedUser(row.subUsers, row);
                }
            });
        };

        $scope.toggleRoleSub = function (role) {

            if (role.isChecked) {
                role.isChecked = false;
            } else {
                role.isChecked = true;
            }

            // 如果是父节点,同步设置子节点
            if (role.id === constant.guid.empty) {

                if (role.subRoles && role.subRoles.length > 0) {
                    role.subRoles.forEach(function (row) {
                        row.isChecked = role.isChecked;
                    });
                }
            } else {
                var selectedRoleList = _.filter($scope.roleTreeData[0].subRoles, function (num) { return num.isChecked });
                if (selectedRoleList && selectedRoleList.length === $scope.roleTreeData[0].subRoles.length) {
                    $scope.roleTreeData[0].isChecked = role.isChecked;
                } else {
                    $scope.roleTreeData[0].isChecked = false;
                }
            }
        };

        $scope.setProjectUserRole = function () {

            if (!$scope.roleTreeData || $scope.roleTreeData.length === 0) {
                $log.debug('no role list');
                return;
            }

            // 保存用户分配信息
            var selectedUser = _.filter($scope.assignUserSet, function (num) { return (!num.subUsers || num.subUsers.length === 0) && num.id !== $scope.selectUserSpan.id });

            if (!selectedUser || selectedUser.length === 0) {
                $log.debug('please select user....');
                return;
            }

            var inpara = [];

            // 选中checkbox 设置默认权限
            selectedUser.forEach(function (userInfo) {
                var para = {};
                para.UserID = userInfo.id;
                para.userName = userInfo.userName;
                para.projectID = $scope.assignProject.id;
                para.projectName = $scope.assignProject.name;
                para.serviceTypeID = $scope.assignProject.serviceTypeID;
                para.serviceTypeName = $scope.assignProject.serviceTypeName;
                para.isActive = userInfo.isSelected;
                inpara.push(para);
            });

            // 设置单选的用户的权限
            if ($scope.selectUserSpan && $scope.selectUserSpan.id) {
                $scope.roleTreeData[0].subRoles.forEach(function (roleInfo) {
                    var para = {};
                    para.UserID = $scope.selectUserSpan.id;
                    para.userName = $scope.selectUserSpan.userName;
                    para.roleID = roleInfo.id;
                    para.roleName = roleInfo.name;
                    para.projectID = $scope.assignProject.id;
                    para.projectName = $scope.assignProject.name;
                    para.serviceTypeID = $scope.assignProject.serviceTypeID;
                    para.serviceTypeName = $scope.assignProject.serviceTypeName;
                    para.isActive = roleInfo.isChecked;
                    inpara.push(para);
                });
            }

            userService.setProjectUserRole(inpara).success(function (data) {
                if (data && data.result) {

                    SweetAlert.success($translate.instant('SaveSuccess'));
                    $log.debug('setProjectUserRole success...');
                    $('#assignUserPop').modal('hide');
                } else {
                    swal($translate.instant('SaveFail'), $translate.instant(data.resultMsg), 'warning');
                }
            });
        };

        $scope.selectUserSpanClick = function (user) {
            if ($scope.selectUserSpan && $scope.selectUserSpan.id && $scope.selectUserSpan.id === user.id) {
                $scope.selectUserSpan = {};

            } else {
                $scope.selectUserSpan = user;
            }

            setUserRoleSetList($scope.selectUserSpan);
        };

        // form validate
        var resetErrorStatus = function () {
            var currentForm = $('#projectForm');
            currentForm.find('.has-error').removeClass('has-error');

            var settingForm = $('.project-modal-table')[0];

            $(settingForm).find('.has-error').removeClass('has-error');

            validator.resetForm();
        };

        var resources = {
            nameRequired: $translate.instant('ProjectNameRequired'),
            codeRequired: $translate.instant('ProjectCodeRequired'),
            selectOrganizationRequired: $translate.instant('SelectOrganizationRequired'),
            selectIndustryRequired: $translate.instant('SelectIndustryRequired'),
            selectedYearRequired: $translate.instant('SelectedYearRequired'),
            selectedServiceRequired: $translate.instant('SelectedServiceRequired'),
            selectedModuleRequired: $translate.instant('SelectedModuleRequired'),
        };


        var validator = $("#projectForm").validate({
            errorClass: "has-error",
            ignore: "",
            rules: {
                name: {
                    required: true
                },
                code: {
                    required: true
                },
                //orgName: {
                //    required: true
                //},
                selectedIndustry: {
                    required: true
                },
                selectedYear: {
                    required: true
                },
                selectedService: {
                    required: true
                },
                selectedModule: {
                    required: true
                },
                selectedOrgName: {
                    required: true,
                }
            },
            messages: {
                name: {
                    required: resources.nameRequired
                },
                code: {
                    required: resources.codeRequired
                },
                //orgName: {
                //    required: resources.selectOrganizationRequired
                //},
                selectedIndustry: {
                    required: resources.selectIndustryRequired
                },
                selectedYear: {
                    required: resources.selectedYearRequired
                },
                selectedService: {
                    required: resources.selectedServiceRequired
                },
                selectedModule: {
                    required: resources.selectedModuleRequired
                },
                selectedOrgName: {
                    required: resources.selectOrganizationRequired
                }
            },
            errorPlacement: function (error, element) {
                setErrorStyle(error, element);
            }
        });

        var setErrorStyle = function (error, element) {
            if (element.hasClass('has-error')) {
                element.parent().addClass('has-error');
                error.insertAfter(element);
                error.addClass('label');
                // error.addClass('label-danger');
            }
        };


        $scope.$watch('editProjectModel.organizationID', function (newValue, oldValue) {

            if (newValue !== oldValue && $scope.editProjectModel.componentSelectedOrg) {
                $log.debug('newValue:' + newValue + ',oldValue:' + oldValue);

                $scope.editProjectModel.industryID = $scope.editProjectModel.componentSelectedOrg.industryID;
                var first = _.find($scope.projectIndustryList, function (num) { return num.id === $scope.editProjectModel.industryID });
                if (first) {
                    $scope.selectedIndustry = first;
                }
            }

        });

        $scope.showOperateLogPop = function () {
            $scope.isShowLog = true;
            // $('#showOperatePop').modal('show');
        };

        (function initialize() {
            $log.debug('projectManageController.ctor()...');
            //scope model
            $scope.title = '项目管理';
            $scope.serviceList = [];
            $scope.queryService = '';
            $scope.projectYearList = [];
            $scope.projectIndustryList = [];
            $scope.queryProjectYear = '';
            $scope.projectList = [];
            $scope.isAdd = false;
            $scope.editProjectModel = {};

            $scope.chk = false;
            $scope.userList = [];
            $scope.selectUserIDs = ',';

            $scope.checkedRolesSet = {};
            $scope.selectedIndustry = {};

            $scope.selectProject = {};
            $scope.set = [];
            $scope.searchText = '';
            $scope.selectUserSpan = {};

            $scope.gridOptions = {
                rowHeight: 50,
                selectionRowHeaderWidth: 50,
                enableFullRowSelection: false,
                enableRowSelection: false,
                enableSorting: false,
                enableFiltering: false,
                enableColumnMenus: false,
                enableRowHeaderSelection: false,
                enableHorizontalScrollbar: uiGridConstants.scrollbars.NEVER,
                columnDefs: [
                {
                    field: 'index', name: $translate.instant('SequenceNoCol'), width: '10%', headerCellClass: 'right', enableFiltering: false,

                    cellTemplate: '<div class="ui-grid-cell-contents right"><span>{{row.entity.index}}<span></div>'
                },
                  {
                      field: 'name', name: $translate.instant('ProjectNameCol'), width: '20%', headerCellClass: '',

                      cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.nameDisplay}}<span></div>'
                  },

                  {
                      field: 'organizationName', name: $translate.instant('ProjectCompanyCol'), width: '25%', headerCellClass: '',

                      cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.organizationNameDisplay}}</span></div>'
                  },
                  {
                      field: 'industryName', name: $translate.instant('PIndustry'), width: '10%', headerCellClass: '',

                      cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.industryNameDisplay}}</span></div>'
                  },
                  {
                      field: 'year', name: $translate.instant('ProjectYearCol'), width: '10%', headerCellClass: '',

                      cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.yearDisplay}}</span></div>'
                  },
                   {
                       field: 'serviceTypeName', name: $translate.instant('ProjectServiceCol'), width: '15%', headerCellClass: '',

                       cellTemplate: '<div class="ui-grid-cell-contents"><span>{{row.entity.serviceTypeName}}</span></div>'
                   },
                  {
                      name: $translate.instant('OrganizationStructureOperation'), width: '10%', headerCellClass: 'center', enableFiltering: false,
                      cellTemplate: '<div class="project-manage-grid-operation ui-grid-cell-contents">' +
                          '<a class="operate-btn" href="javascript:void(0)" ng-click="grid.appScope.assignUser(row.entity)"> <i class="material-icons">person</i><span></span></a>' +

                          '<a class="operate-btn" href="javascript:void(0)" ng-click="grid.appScope.loadProject(row.entity.id)"> <i ng-if="row.entity.nameDisplay" class="material-icons">create</i><span></span></a>' +
                          '</div>'
                  }
                ],
                onRegisterApi: function (gridApi) {
                    $scope.gridApi = gridApi;
                    $scope.gridApi.grid.registerRowsProcessor($scope.singleFilter, 200);
                }
            };

            $scope.singleFilter = function (renderableRows) {
                var matcher = new RegExp($scope.searchProjectText);

                var isSelectYear = false;
                if ($scope.queryProjectYear && $scope.queryProjectYear.length > 0) {
                    isSelectYear = true;
                };

                renderableRows.forEach(function (row) {
                    var match = false;
                    if (isSelectYear && row.entity.year + '' !== $scope.queryProjectYear) {
                        match = false;
                    } else {
                        ['name', 'serviceTypeName', 'organizationName', 'industryName'].forEach(function (field) {
                            if (row.entity[field].match(matcher)) {
                                match = true;
                            }
                        });
                    }

                    if (!match) {
                        row.visible = false;
                    }
                });

                return renderableRows;
            };

            $scope.gridOptions.noData = false;

            $scope.newProject = newProject;

            $scope.saveProject = saveProject;

            $scope.loadProject = loadProject;

            $scope.deleteProject = deleteProject;

            $scope.deleteProjects = deleteProjects;

            $scope.deleteProjectConfirm = deleteProjectConfirm;

            $scope.deleteProjectsConfirm = deleteProjectsConfirm;

            $scope.reloadProjectData = reloadProjectData;

            $scope.assignUser = assignUser;

            $scope.getUserChecked = getUserChecked;

            $scope.initProjectList = initProjectList;

            $scope.roleTreeLoad = roleTreeLoad;

            $scope.selectNode = selectNode;

            $scope.toggle = toggle;

            $scope.toggleSub = toggleSub;
            $scope.search = search;

            $scope.checkUser = checkUser;

            //init project list
            //init service dropdown list
            initServiceList();

            initProjectList();

            //init project year dropdown list
            initProjectYear();

            loadProjectIndustryList();

            loadAllTemplate();

            // 加载用户列表
            // initUser();

        })();

    }
]);