void OnClickContentsLink(Item.ContentsListInfo info)
    {
        if (info.ContentsLinkType == 1)//재료조합
        {
        }
        else if (info.ContentsLinkType == 2)//바로가기(던전)
        {
            if (!CheckContentsLink(info, true))
            {
                return;
            }

            bool isBasePanelHide = true;
            switch (info.ContentsType)
            {
            case 1:    //조합

                break;

            case 11:    //차관
                UIMgr.OpenArenaPanel();
                break;

            case 12:    //난투장
                UIMgr.OpenDogFight();
                break;

            case 2:    //모험 일반
            case 3:    //모험 어려움
                if (BasePanel != null && BasePanel is ChapterPanel)
                {
                    isBasePanelHide = false;
                    (BasePanel as ChapterPanel).SetStageInfoPopup(info.ContentsIdx);
                }

                if (isBasePanelHide)
                {
                    UIMgr.OpenChapter(null, info.ContentsIdx);
                }
                break;

            case 4:    //마계의탑
                UIMgr.OpenTowerPanel(info.ContentsIdx);
                break;

            case 5:    //보스레이드
                DungeonTable.SingleBossRaidInfo bossRaid = _LowDataMgr.instance.GetSingleBossRaidLimitLevel(info.ContentsIdx);
                UIMgr.OpenDungeonPanel(false, 0, GAME_MODE.RAID, bossRaid.Type);
                break;

            case 6:    //멀티 보스레이드
                DungeonTable.MultyBossRaidInfo multyBossRaid = _LowDataMgr.instance.GetLowDataMultyBossInfo(info.ContentsIdx);
                UIMgr.OpenDungeonPanel(false, 0, GAME_MODE.MULTI_RAID, multyBossRaid.Type);
                break;

            case 7:    //콜로세움
                UIMgr.OpenColosseumPanel(0);
                break;

            case 8:    //골드 던전
                UIMgr.OpenDungeonPanel(false, 0, GAME_MODE.SPECIAL_GOLD, 0);
                break;

            case 9:    //경험치 던전
                UIMgr.OpenDungeonPanel(false, 0, GAME_MODE.SPECIAL_EXP, 0);
                break;

            case 10:    //길드
                UIMgr.OpenGuildPanel();
                break;
            }

            if (isBasePanelHide && BasePanel != null)
            {
                BasePanel.ObjectHide();
            }

            Hide();
        }
    }
    /// <summary> 아이템 디테일 팝업 실행 함수. </summary>
    void SetDetailPopup(NetData._ItemData itemData)
    {
        CurItemData = itemData;
        Debug.Log(string.Format("Click Item UseId={0}, equipId={1}", itemData._useitemDataIndex, itemData._equipitemDataIndex));
        bool isDifferentClass = false;

        NetData._UserInfo charInven = NetData.instance.GetUserInfo();

        if (CurItemData.IsEquipItem())
        {
            LinkPopup[0].SetActive(false);
            LinkPopup[1].SetActive(false);

            int limitLv = CurItemData.GetEquipLowData().LimitLevel;
            //EquipLv.text = string.Format(_LowDataMgr.instance.GetStringCommon(952), limitLv);
            if (limitLv <= charInven._Level && !isDifferentClass)//내 직업이고 레벨이 높다면
            {
                EquipState[0].SetActive(true);
                EquipState[1].SetActive(false);
            }
            else
            {
                EquipState[0].SetActive(false);
                EquipState[1].SetActive(true);
            }

            uint strKey = 0;
            if (BasePanel is EquipmentPanel)
            {
                Item.EquipmentInfo equipLow = CurItemData.GetEquipLowData();
                if (CurItemData._enchant < equipLow.MaxEnchant)
                {
                    strKey = 31;
                }
                else if (0 < equipLow.NextPartsId)
                {
                    strKey = 32;
                }
                else//최대
                {
                    strKey = 1182;
                }
            }
            else
            {
                strKey = 106;//닫기
            }
            if (0 < strKey)
            {
                SetOnOff(MainBtn.transform, true, _LowDataMgr.instance.GetStringCommon(strKey));
            }

            //텍스트 셋팅
            int    grade = itemData.GetEquipLowData().Grade;
            string color = UIHelper.GetItemGradeColor(grade);
            ItemName.text = string.Format("{0}{1}[-] [FFE400]+{2}[-]", color, itemData.GetLocName(), itemData._enchant);
        }
        else
        {
            //EquipLv.text = "";
            EquipState[0].SetActive(false);
            EquipState[1].SetActive(false);
            LinkPopup[0].SetActive(true);
            LinkPopup[1].SetActive(false);

            SetOnOff(MainBtn.transform, true, _LowDataMgr.instance.GetStringCommon(106));
            int count = charInven.GetItemCountForItemId(CurItemData._useitemDataIndex, (byte)eItemType.USE);
            LinkItemSlot[0].SetLowDataItemSlot(CurItemData._useitemDataIndex, (uint)count);
            LinkItemSlot[0].transform.parent.FindChild("Lock").gameObject.SetActive(count <= 0);

            Transform gridTf = LinkScroll.transform.FindChild("Grid");
            List <Item.ContentsListInfo> conList = _LowDataMgr.instance.GetLowDataContentsItemList(CurItemData._useitemDataIndex);
            for (int i = 0; i < conList.Count; i++)
            {
                Item.ContentsListInfo info = conList[i];
                string contentsName        = _LowDataMgr.instance.GetStringCommon(info.ContentsName);
                if (info.ContentsParam != null && 0 < info.ContentsParam.Count)
                {
                    if (contentsName.Contains("{0}") && contentsName.Contains("{1}"))
                    {
                        contentsName = string.Format(contentsName, info.ContentsParam[0], info.ContentsParam[1]);
                    }
                    else if (contentsName.Contains("{0}"))
                    {
                        contentsName = string.Format(contentsName, info.ContentsParam[0]);
                    }
                }

                Transform tf = null;
                if (i < gridTf.childCount)
                {
                    tf = gridTf.GetChild(i);
                }
                else
                {
                    tf            = Instantiate(gridTf.GetChild(0)) as Transform;
                    tf.parent     = gridTf;
                    tf.localScale = Vector3.one;
                }

                tf.gameObject.SetActive(true);

                tf.FindChild("txt").GetComponent <UILabel>().text = contentsName;
                bool isEnter = true;
                if (CheckContentsLink(info, false))//조건 만족
                {
                    tf.FindChild("error_txt").GetComponent <UILabel>().text = "";
                }
                else
                {
                    isEnter = false;

                    string contentsError = _LowDataMgr.instance.GetStringCommon(info.ConditionName);
                    if (info.ConditionParam != null && 0 < info.ConditionParam.Count)
                    {
                        if (contentsError.Contains("{0}") && contentsError.Contains("{1}"))
                        {
                            contentsError = string.Format(contentsError, info.ConditionParam[0], info.ConditionParam[1]);
                        }
                        else if (contentsError.Contains("{0}"))
                        {
                            contentsError = string.Format(contentsError, info.ConditionParam[0]);
                        }
                    }

                    tf.FindChild("error_txt").GetComponent <UILabel>().text = contentsError;
                }

                EventDelegate.Set(tf.FindChild("Btn").GetComponent <UIEventTrigger>().onClick, () => { OnClickContentsLink(info); });
                if (info.ContentsLinkType == 1)//재료조합
                {
                    tf.FindChild("Btn/On/label").GetComponent <UILabel>().text  = _LowDataMgr.instance.GetStringCommon(39);
                    tf.FindChild("Btn/Off/label").GetComponent <UILabel>().text = _LowDataMgr.instance.GetStringCommon(39);
                }
                else if (info.ContentsLinkType == 2)//바로가기(던전)
                {
                    tf.FindChild("Btn/On/label").GetComponent <UILabel>().text  = _LowDataMgr.instance.GetStringCommon(249);
                    tf.FindChild("Btn/Off/label").GetComponent <UILabel>().text = _LowDataMgr.instance.GetStringCommon(249);
                }

                tf.FindChild("Btn/On").gameObject.SetActive(isEnter);
                tf.FindChild("Btn/Off").gameObject.SetActive(!isEnter);
            }

            gridTf.GetComponent <UIGrid>().repositionNow = true;
            for (int j = conList.Count; j < gridTf.childCount; j++)
            {
                gridTf.GetChild(j).gameObject.SetActive(false);
            }

            if (conList.Count < 4)
            {
                LinkScroll.enabled = false;
            }
            else
            {
                LinkScroll.enabled = true;
            }

            Item.ItemInfo data  = itemData.GetUseLowData();
            string        color = UIHelper.GetItemGradeColor(data == null ? 0 : (int)data.Grade);
            ItemName.text = string.Format("{0}{1}[-] [FFE400][-]", color, itemData.GetLocName());
        }

        //아이템 셋팅
        ItemSlot.SetInvenItemSlot(itemData, null, 0);

        //아이템의 옵션들 셋팅
        byte optionCount = 0;

        Desc.transform.localPosition = SetAbility(itemData, ref optionCount); //어빌리티
        SetDesc(itemData, ref optionCount);                                   //아이템 설명 표현

        OptionScrollView.ResetPosition();
        if (optionCount <= 1)//스크롤 되면 안됨.
        {
            AbilityTf.parent.collider.enabled = false;
        }
        else
        {
            AbilityTf.parent.collider.enabled = true;
        }
    }
    /// <summary> 조건 체크. </summary>
    bool CheckContentsLink(Item.ContentsListInfo info, bool isClick)
    {
        bool isEnter = false;

        switch (info.ContentsType)
        {
        case 1:    //조합

            break;

        case 11:    //차관
            if (_LowDataMgr.instance.GetEtcTableValue <uint>(EtcID.PvpEnterLv) <= NetData.instance.UserLevel)
            {
                isEnter = true;
            }
            break;

        case 12:    //난투장
            List <DungeonTable.FreefightTableInfo> freeList = _LowDataMgr.instance.GetLowDataFreeFightList();
            for (int i = 0; i < freeList.Count; i++)
            {
                if (NetData.instance.UserLevel < freeList[i].MinenterLv || freeList[i].MaxenterLv < NetData.instance.UserLevel)
                {
                    continue;
                }

                isEnter = true;
                break;
            }

            break;

        case 2:    //모험 일반
        case 3:    //모험 어려움
            uint require = 0;
            NetData.ClearSingleStageData stageData = null;
            if (!NetData.instance.GetUserInfo().ClearSingleStageDic.TryGetValue(info.ContentsIdx, out stageData))
            {
                DungeonTable.StageInfo stageInfo = _LowDataMgr.instance.GetStageInfo(info.ContentsIdx);
                if (stageInfo != null && stageInfo.RequireStageId != null && 0 < stageInfo.RequireStageId.list.Count)
                {
                    List <string> conList = stageInfo.RequireStageId.list;
                    for (int i = 0; i < conList.Count; i++)
                    {
                        uint conIdx = uint.Parse(conList[i]);
                        if (NetData.instance.GetUserInfo().ClearSingleStageDic.TryGetValue(conIdx, out stageData))    //이전 스테이지 클리어해야함.
                        {
                            continue;
                        }

                        require = 1;    //진행 불가능
                        break;
                    }
                }
            }

            if (require <= 0)
            {
                isEnter = true;
            }

            break;

        case 5:    //보스레이드
            DungeonTable.SingleBossRaidInfo bossRaid = _LowDataMgr.instance.GetSingleBossRaidLimitLevel(info.ContentsIdx);
            if (bossRaid.levelLimit <= NetData.instance.UserLevel)
            {
                isEnter = true;
            }
            break;

        case 6:    //멀티 보스레이드
            DungeonTable.MultyBossRaidInfo multyBossRaid = _LowDataMgr.instance.GetLowDataMultyBossInfo(info.ContentsIdx);
            if (multyBossRaid.levelLimit <= NetData.instance.UserLevel)
            {
                isEnter = true;
            }
            break;

        case 10:    //길드
            if (0 < NetData.instance.GetUserInfo()._GuildId)
            {
                isEnter = true;
            }
            break;

        case 4:    //마계의탑
        case 7:    //콜로세움
        case 8:    //골드 던전
        case 9:    //경험치 던전
            byte idx = 0;
            if (info.ContentsType == 4)
            {
                idx = (byte)9;
            }
            else if (info.ContentsType == 7)
            {
                idx = (byte)1;
            }
            else if (info.ContentsType == 8)
            {
                idx = (byte)3;
            }
            else if (info.ContentsType == 9)
            {
                idx = (byte)2;
            }

            DungeonTable.ContentsOpenInfo content = _LowDataMgr.instance.GetFirstContentsOpenInfo(idx);
            if (content.ConditionType1 == 2 && content.ConditionValue1 <= NetData.instance.GetUserInfo()._TotalAttack)
            {
                isEnter = true;
            }
            else if (content.ConditionType1 == 1 && content.ConditionValue1 <= NetData.instance.UserLevel)
            {
                isEnter = true;
            }
            break;
        }

        if (!isEnter)
        {
            if (isClick)
            {
                SceneManager.instance.SetNoticePanel(NoticeType.Message, 0, _LowDataMgr.instance.GetStringCommon(712));
            }
            return(false);
        }

        return(true);
    }