// static
void LLPanelGroupGeneral::onClickCopyLink(void* userdata)
{
	LLPanelGroupGeneral* self = (LLPanelGroupGeneral*)userdata;

	if (!self || (self->mGroupID).isNull()) return;

	LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(self->mGroupID);

	// make sure we don't have junk
	if (gdatap)
	{
		std::string buffer = LLURLDispatcher::createGroupJoinLink(gdatap->getID());

		// Say same info in chat -- MC
		LLStringUtil::format_map_t targs;	
		targs["[IZURL]"] = buffer;
		std::string msg = self->getString("copy_group_link_info");
		LLStringUtil::format(msg, targs);

		LLChat chat;
		chat.mSourceType = CHAT_SOURCE_SYSTEM;
		chat.mText = msg;
		LLFloaterChat::addChat(chat);

		gViewerWindow->mWindow->copyTextToClipboard(utf8str_to_wstring(buffer));
	}
	else
	{
		llwarns << "Trying to copy group izurl link with no group data!" << llendl;
	}
}
// virtual
void LLPanelGroupGeneral::update(LLGroupChange gc)
{
    if (mGroupID.isNull()) return;

    LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);

    if (!gdatap) return;

    LLGroupData agent_gdatap;
    bool is_member = false;
    if (gAgent.getGroupData(mGroupID,agent_gdatap)) is_member = true;

    if (mComboActiveTitle)
    {
        mComboActiveTitle->setVisible(is_member);

        if ( mActiveTitleLabel) mActiveTitleLabel->setVisible(is_member);

        if (is_member)
        {
            LLUUID current_title_role;

            mComboActiveTitle->clear();
            mComboActiveTitle->removeall();
            bool has_selected_title = false;

            if (1 == gdatap->mTitles.size())
            {
                // Only the everyone title.  Don't bother letting them try changing this.
                mComboActiveTitle->setEnabled(FALSE);
            }
            else
            {
                mComboActiveTitle->setEnabled(TRUE);
            }

            std::vector<LLGroupTitle>::const_iterator citer = gdatap->mTitles.begin();
            std::vector<LLGroupTitle>::const_iterator end = gdatap->mTitles.end();

            for ( ; citer != end; ++citer)
            {
                mComboActiveTitle->add(citer->mTitle,citer->mRoleID, (citer->mSelected ? ADD_TOP : ADD_BOTTOM));
                if (citer->mSelected)
                {
                    mComboActiveTitle->setCurrentByID(citer->mRoleID);
                    has_selected_title = true;
                }
            }

            if (!has_selected_title)
            {
                mComboActiveTitle->setCurrentByID(LLUUID::null);
            }
        }

        mComboActiveTitle->resetDirty();
    }

    // After role member data was changed in Roles->Members
    // need to update role titles. See STORM-918.
    if (gc == GC_ROLE_MEMBER_DATA)
        LLGroupMgr::getInstance()->sendGroupTitlesRequest(mGroupID);

    // If this was just a titles update, we are done.
    if (gc == GC_TITLES) return;

    bool can_change_ident = false;
    bool can_change_member_opts = false;
    can_change_ident = gAgent.hasPowerInGroup(mGroupID,GP_GROUP_CHANGE_IDENTITY);
    can_change_member_opts = gAgent.hasPowerInGroup(mGroupID,GP_MEMBER_OPTIONS);

    if (mCtrlShowInGroupList)
    {
        mCtrlShowInGroupList->set(gdatap->mShowInList);
        mCtrlShowInGroupList->setEnabled(can_change_ident);
        mCtrlShowInGroupList->resetDirty();

    }
    if (mComboMature)
    {
        if(gdatap->mMaturePublish)
        {
            mComboMature->setCurrentByIndex(MATURE_CONTENT);
        }
        else
        {
            mComboMature->setCurrentByIndex(NON_MATURE_CONTENT);
        }
        mComboMature->setEnabled(can_change_ident);
        mComboMature->setVisible( !gAgent.isTeen() );
        mComboMature->resetDirty();
    }
    if (mCtrlOpenEnrollment)
    {
        mCtrlOpenEnrollment->set(gdatap->mOpenEnrollment);
        mCtrlOpenEnrollment->setEnabled(can_change_member_opts);
        mCtrlOpenEnrollment->resetDirty();
    }
    if (mCtrlEnrollmentFee)
    {
        mCtrlEnrollmentFee->set(gdatap->mMembershipFee > 0);
        mCtrlEnrollmentFee->setEnabled(can_change_member_opts);
        mCtrlEnrollmentFee->resetDirty();
    }

    if (mSpinEnrollmentFee)
    {
        S32 fee = gdatap->mMembershipFee;
        mSpinEnrollmentFee->set((F32)fee);
        mSpinEnrollmentFee->setEnabled(fee && can_change_member_opts);
        mSpinEnrollmentFee->resetDirty();
    }
    if ( mBtnJoinGroup )
    {
        std::string fee_buff;
        bool visible;

        visible = !is_member && gdatap->mOpenEnrollment;
        mBtnJoinGroup->setVisible(visible);

        if ( visible )
        {
            fee_buff = llformat( "Join (%s%d)",
                                 gHippoGridManager->getConnectedGrid()->getCurrencySymbol().c_str(),
                                 gdatap->mMembershipFee);
            mBtnJoinGroup->setLabelSelected(fee_buff);
            mBtnJoinGroup->setLabelUnselected(fee_buff);
        }
    }
    if ( mBtnInfo )
    {
        mBtnInfo->setVisible(is_member && !mAllowEdit);
    }

    if(gc == GC_ALL || gc == GC_PROPERTIES)
    {
        if (mCtrlReceiveNotices)
        {
            mCtrlReceiveNotices->setVisible(is_member);
            if (is_member)
            {
                if(!mCtrlReceiveNotices->isDirty())	//If the user hasn't edited this then refresh it. Value may have changed in groups panel, etc.
                {
                    mCtrlReceiveNotices->set(agent_gdatap.mAcceptNotices);
                    mCtrlReceiveNotices->resetDirty();
                }
            }
        }

        if (mCtrlListGroup)
        {
            mCtrlListGroup->setVisible(is_member);
            if (is_member)
            {
                if(!mCtrlListGroup->isDirty())	//If the user hasn't edited this then refresh it. Value may have changed in groups panel, etc.
                {
                    mCtrlListGroup->set(agent_gdatap.mListInProfile);
                    mCtrlListGroup->resetDirty();
                }
            }
        }

        if (mCtrlReceiveChat)
        {
            mCtrlReceiveChat->setVisible(is_member);
            if (is_member)
            {
                if(!mCtrlReceiveChat->isDirty())	//If the user hasn't edited this then refresh it. Value may have changed in groups panel, etc.
                {
                    mCtrlReceiveChat->set(!gIMMgr->getIgnoreGroup(mGroupID));
                    mCtrlReceiveChat->resetDirty();
                }
            }
        }

        if (mInsignia) mInsignia->setEnabled(can_change_ident);
        if (mEditCharter) mEditCharter->setEnabled(can_change_ident);

        if (mGroupName) mGroupName->setText(gdatap->mName);
        if (mGroupNameEditor) mGroupNameEditor->setVisible(FALSE);
        if (mFounderName) mFounderName->setNameID(gdatap->mFounderID,FALSE);

        LLNameEditor* key_edit = getChild<LLNameEditor>("group_key");
        if(key_edit)
        {
            key_edit->setText(gdatap->getID().asString());
        }

        if (mInsignia)
        {
            if (gdatap->mInsigniaID.notNull())
            {
                mInsignia->setImageAssetID(gdatap->mInsigniaID);
            }
            else
            {
                mInsignia->setImageAssetID(mDefaultIconID);
            }
        }

        if (mEditCharter)
        {
            mEditCharter->setText(gdatap->mCharter);
            mEditCharter->resetDirty();
        }
    }

    if (mListVisibleMembers)
    {
        mListVisibleMembers->deleteAllItems();

        if (gdatap->isMemberDataComplete())
        {
            mMemberProgress = gdatap->mMembers.begin();
            mPendingMemberUpdate = TRUE;

            sSDTime = 0.0f;
            sElementTime = 0.0f;
            sAllTime = 0.0f;
        }
        else
        {
            std::stringstream pending;
            pending << "Retrieving member list (" << gdatap->mMembers.size() << "\\" << gdatap->mMemberCount  << ")";

            LLSD row;
            row["columns"][0]["value"] = pending.str();
            row["columns"][0]["column"] = "name";

            mListVisibleMembers->setEnabled(FALSE);
            mListVisibleMembers->addElement(row);
        }
    }
}