/// <summary>
        /// Parse number of bit mask into user information
        /// </summary>
        /// <param name="bitMask">bit mask number</param>
        /// <returns></returns>
        private void ParseBitMaskToObject(long bitMask, ref BitMaskOfUser bitMaskItem)
        {
            //variables
            string binaryString = GlobalFunctions.ParseNumberToBinary(bitMask);

            try
            {
                bitMaskItem.View.Add(binaryString[0] == '0' ? false : true);
                bitMaskItem.Add.Add(binaryString[1] == '0' ? false : true);
                bitMaskItem.Edit.Add(binaryString[2] == '0' ? false : true);
                bitMaskItem.Delete.Add(binaryString[3] == '0' ? false : true);
                //initialize value of bitmask
                for (int i = 4; i < binaryString.Length; i++)
                {
                    if (binaryString[i] == '1')
                    {
                        bitMaskItem.NumberOfBitMask.Add(Convert.ToInt32(Math.Pow(2, i)));
                    }
                }
            }
            catch
            {
            }
        }
        public string RenderGridRole()
        {
            #region Variables
            List <crm_Roles>       listRole     = new List <crm_Roles>();
            List <ColumnRoleModel> listColModel = new List <ColumnRoleModel>();
            BitMaskOfUser          listBitMask  = new BitMaskOfUser()
            {
                View = new List <bool>(), Add = new List <bool>(), Edit = new List <bool>(), Delete = new List <bool>(), NumberOfBitMask = new List <int>()
            };
            //Json string to define row data
            string strRowRecord = "\"row\":[";
            //Json string to define column data
            string strColRecord = "\"column\":";
            //Json string to combine 2 json above
            string strJSON  = "{";
            string bitmask  = "";
            string selected = "";
            //Set temp id
            int userLoginID = 3;
            List <RoleUserModel> LoggedInUserRole;
            int      bitMaskUser  = 0;
            bool     disabledGrid = false;
            bool     hideColumn   = false;
            UserInfo userInfo;
            #endregion

            try
            {
                userInfo    = System.Web.HttpContext.Current.Session["UserInfo"] as UserInfo;
                userLoginID = userInfo.ID;
                //Get max permission of current user
                int maxPerm = userInfo.BitMask.Max();
                switch (maxPerm)
                {
                case (int)UserGroupEnum.TenantAdmin: listRole = _roleService.GetAccessRight(true, maxPerm, userInfo.TenanID).ToList(); break;

                default: listRole = _roleService.GetAccessRight(false, maxPerm, 0).ToList(); break;
                }
                //Check bitmask user to hide or disable edit permision
                LoggedInUserRole = _roleService.GetUserGroupRoles(userLoginID).ToList();
                foreach (RoleUserModel item in LoggedInUserRole)
                {
                    long maskPerm = item.MaskPermission.HasValue ? item.MaskPermission.Value : 0;
                    int  temp     = GlobalFunctions.GetBitMaskOfUser(maskPerm);
                    if (bitMaskUser < temp)
                    {
                        bitMaskUser = temp;
                    }
                }

                //Check authorization to view information

                /*if (userInfo.IsTenant && !userInfo.IsSA && !userInfo.IsOperator )
                 *  hideColumn = true;
                 * else */
                //if (bitMaskUser == (int)UserGroupEnum.Operator)
                //    disabledGrid = true;

                //if user group has data
                if (listRole.Count > 0)
                {
                    #region Column
                    //first column in data grid
                    ColumnRoleModel firstCol = new ColumnRoleModel()
                    {
                        field = string.Empty, title = "", template = "#= TypePermission #"
                    };
                    listColModel.Add(firstCol);
                    //loop all role record in db to render data into column of grid
                    for (int j = 0; j < listRole.Count; j++)
                    {
                        //Get infor of CRUID perm of user
                        long maskPerm = listRole[j].MaskPermission.HasValue ? listRole[j].MaskPermission.Value : 0;
                        ParseBitMaskToObject(maskPerm, ref listBitMask);
                        //Render columns of grid
                        int bitMaskCurrentUser = GlobalFunctions.GetBitMaskOfUser(listRole[j].MaskPermission.HasValue ? listRole[j].MaskPermission.Value : 0);
                        //bool tempHidden = false;
                        //if ((bitMaskCurrentUser == (int)UserGroupEnum.SA || bitMaskCurrentUser == (int)UserGroupEnum.Operator) && hideColumn)
                        //    tempHidden = true;
                        listColModel.Add(new ColumnRoleModel()
                        {
                            title = listRole[j].RoleName, field = "Selected" + j, template = "<div style='text-align:center'><input type='checkbox' " + (disabledGrid ? "disabled='disabled'" : "") + " class='multi check_row' rowIDX='#=rowIndex#' id='Selected" + j + "' #= JSON.parse(Selected" + j + ") ? checked='checked' : '' # /><span class='lbl'></span><span style='display:none'>#=bitMaskUser" + j + "#</span><span style='display:none'>#=idx" + j + "#</span></div>"                                     /*,hidden=tempHidden*/
                        });
                    }

                    strColRecord += JsonConvert.SerializeObject(listColModel);
                    #endregion

                    #region Row
                    //loop 4 row equal to view,add,edit,delete record of grid
                    for (int i = 0; i < 4; i++)
                    {
                        strRowRecord += "{";

                        //Render data of first column
                        switch (i)
                        {
                        case 0: strRowRecord += "\"TypePermission\": \"<i class='multi-icon fa icon_menu-square_alt2 bigger-120'></i> View\","; break;

                        case 1: strRowRecord += "\"TypePermission\": \"<i class='multi-icon fa icon_plus_alt bigger-120'></i> Add\","; break;

                        case 2: strRowRecord += "\"TypePermission\": \"<i class='multi-icon fa icon_pencil bigger-120'></i> Edit\","; break;

                        case 3: strRowRecord += "\"TypePermission\": \"<i class='multi-icon fa icon_trash bigger-120'></i> Delete\","; break;
                        }
                        //Render data of all users
                        for (int j = 0; j < listRole.Count; j++)
                        {
                            //--------------data for checkbox--------//
                            switch (i)
                            {
                            case 0: selected = listBitMask.View[j].ToString(); break;

                            case 1: selected = listBitMask.Add[j].ToString(); break;

                            case 2: selected = listBitMask.Edit[j].ToString(); break;

                            case 3: selected = listBitMask.Delete[j].ToString(); break;
                            }
                            strRowRecord += "\"Selected" + j + "\": \"" + selected.ToString().ToLower() + "\",";
                            //--------------data for checkbox--------//
                            //Bit mask to identity user
                            strRowRecord += "\"bitMaskUser" + j + "\": \"" + listBitMask.NumberOfBitMask[j] + "\",";
                            //Id of role
                            strRowRecord += "\"idx" + j + "\": \"" + listRole[j].ID + "\",";
                        }
                        strRowRecord += "\"rowIndex\":\"" + i + "\"";
                        strRowRecord += i == 3 ? "}" : "},";
                    }
                    strRowRecord += "]";
                    #endregion
                    strJSON += strColRecord + "," + strRowRecord;
                    strJSON += disabledGrid ? ",\"Editable\":\"false\"" : ",\"Editable\":\"true\"";
                }
                strJSON += "}";
                return(strJSON);
            }
            catch
            {
                return(JsonConvert.SerializeObject(""));
            }
        }