#include "StdAfx.h"
#include "ItemTipWindow.h"
#include "FontAgent.h"

#include "ItemManager.h"
#include "PlaneObject.h"
#include "UIWindow.h"
#include "GameResourceManager.h"
#include "FontAgent.h"
#include "UIRoundGauge.h"
#include "UIImage.h"
#include "Icon.h"

cItemTipWindow::cItemTipWindow()
: mGauge(0)
, mTimeTipIdx(0)
, mItemIndex(0)
, mCheckTime(false)
//, mSlotIndex(UINT_MAX)
, mSlotCount(0)
, mUpdateSizebyTime( false )
{
	Clear();
	::memset( mImage, 0, sizeof(mImage) );
	::memset( mSlotImage, 0, sizeof(mSlotImage) );
}

cItemTipWindow::~cItemTipWindow()
{
	for( int i = 0; i < MAX_CARD_SLOT; ++i )
	{
		SAFE_DELETE( mImage[i] );
		SAFE_DELETE( mSlotImage[i] );
	}
}

void cItemTipWindow::Clear()
{
	cTipWindow::Clear();
	mGauge = 0;
	mTimeTipIdx = 0;
	mItemIndex = 0;
	mCheckTime = false;
//	mSlotIndex = UINT_MAX;
	mSaveCoolTime.Clear();
	mUpdateSizebyTime = true;
	mTimerEnabled = false;
	mSlotCount = 0;
	mImagePosY = 0;

	for( int i = 0; i < MAX_CARD_SLOT; ++i )
		mShowImage[i] = false;
}

bool cItemTipWindow::OnCreate( cUINodeProperty* prop )
{
	if( cTipWindow::OnCreate( prop ) == false )
		return false;

	/// 슬롯 타입 이미지 읽기
	cUISkin* pSkin = UIMAN->GetSkin();
	if( !pSkin )
	{
		assert(0);
		return false;
	}

	cString str;
	NiTexture* texture = 0;
	for( unsigned int i = 0; i < MAX_CARD_SLOT-1; ++i )
	{
		str.Format( "PutCard_SlotType%d", i );
		cUINodeSkin* pSlotSkin = pSkin->GetNodeSkin( str );
		if( pSlotSkin )
		{
			mTexPos[i].mX = pSlotSkin->mSkinInfo->mTexX;
			mTexPos[i].mY = pSlotSkin->mSkinInfo->mTexY;

			texture = pSlotSkin->mpTexture;
		}
	}

	if( !texture )
	{
		assert(0);
		return false;
	}

	/// 이미지 생성
	cUINodeSkin* imgSkin = pSkin->GetNodeSkin( "PutCard_Slot0" );
	if( !imgSkin )
		return false;

	for( int i = 0; i < MAX_CARD_SLOT; ++i )
	{
		mImage[i] = new cUIImage;
		unsigned int x = imgSkin->mSkinInfo->mX;
		unsigned int y = imgSkin->mSkinInfo->mY;
		unsigned int w = imgSkin->mSkinInfo->mWidth;
		unsigned int h = imgSkin->mSkinInfo->mHeight;
		mImage[i]->SetScreenRect( cUIRect( x, y, x + w, y + h ) );
	}

	/// 슬롯 이미지 생성
	for( int i = 0; i < MAX_CARD_SLOT; ++i )
	{
		str.Format( "PutCard_SlotPos%d", i );
		imgSkin = pSkin->GetNodeSkin( str );
		if( imgSkin && texture )
		{
			mSlotImage[i] = new cUIImage( texture );
			unsigned int x = imgSkin->mSkinInfo->mX;
			unsigned int y = imgSkin->mSkinInfo->mY;
			mSlotSize.mWidth = imgSkin->mSkinInfo->mWidth;
			mSlotSize.mHeight = imgSkin->mSkinInfo->mHeight;
			mSlotImage[i]->SetScreenRect( cUIRect(x, y, x+mSlotSize.mWidth, y+mSlotSize.mHeight) );
		}
	}
	return true;
}

void cItemTipWindow::OnRender( cUIFontItemKeeper* fontKeeper )
{	
	if( mVisible == false )
		return;

	/// 배경
	mMiddleBack->Draw();

	if( mSlotCount > 0 )
	{
		for( unsigned int i = 0; i < mSlotCount; ++i )
		{
			if( mSlotImage[i] )
				mSlotImage[i]->Draw();

			if( mImage[i] && mShowImage[i] == true )
				mImage[i]->Draw();
		}
	}

	int px = mX + GAP_SIZE;
	int py = mY;

	/// 데이터 출력 
	for( unsigned int row = 0; row < mIndex; ++row )
	{
		cStringT& str = mToolTip[row].mString;
		if( str.IsEmpty() )
			continue;

		py += mToolTip[row].mGapCount * GAP_SIZE;

		/// 다음줄 출력 
		unsigned int color = mToolTip[row].mColor;
		fontKeeper->AddFontItem( cFontAgent::eFont_System, (LPCTSTR)str.Cstr(), px, py, color );

		py += mLineHeight;
	}

	///
	fontKeeper->DrawAll();
}

bool cItemTipWindow::SetItemInfo( eTip_Kind tipkind, const cUIPos& pos, sInventory& inven, bool checkTime )
{
	cItemDefine* itemDefine = ITEMMAN->GetItemDefine( inven.ItemIndex );
	if( itemDefine == 0 )
		return false;

	Clear();

	mItemIndex = inven.ItemIndex;
	mCheckTime = checkTime;

	bool bStore = false;
	eItemIn itemIn = ITEMMAN->GetItemIn( inven.number );
	if( itemIn == ITEM_IN_NPCSTORE )
		bStore = true;

	//////////////////////////////////////////////////////////////////////////
	/// Tip Start
	AddGap( 1 );
	SetName( itemDefine, inven.enhanced );

	/// 레어도 설정
	SetRare( itemDefine );
	AddGap( 1 );

	/// 아이템 분류 설정 
	unsigned char type = itemDefine->GetType();
	unsigned char subType = itemDefine->GetSubType();
	short defenseType = 0;

	cItemAbility* itemAbil = itemDefine->GetAbililty();
	if( itemAbil )
		defenseType = itemAbil->GetDefenseType();

	SetType( type, subType, defenseType );
	AddGap( 1 );

	/// 장착성 아이템
	if( type == ITEM_WEAPON || type == ITEM_WEAR || type == ITEM_ACCESSORY )
	{
		/// 아이템 기본 수치 설정
		if( SetBasic( itemDefine, inven.enhanced ) == true )
			AddGap( 1 );

		/// 아이템 추가 수치 설정
		if( SetSpecial( itemDefine ) == true )
			AddGap( 1 );
	}
	else if( type == ITEM_CARD && subType == ITEM_CARD_EQUIP_C )
	{
		/// 아이템 기본 수치 설정
		if( SetBasic( itemDefine, inven.enhanced ) == true )
			AddGap( 1 );

		/// 아이템 추가 수치 설정
		if( SetSpecialCard( itemDefine ) == true )
			AddGap( 1 );
	}
	else
	{
		/// 비장착성 아이템 
		/// 사용효과 설정
		if( SetEffect( itemDefine ) == true )
			AddGap( 1 );

		/// 재사용시간 설정
		if( SetUseTime( itemDefine ) == true )
			AddGap( 1 );
	}

	/// 카드정보세팅
	if( bStore == false )
		SetCard( inven );

	/// 아이템 제한 설정
	if( SetLimit( itemDefine ) == true )
		AddGap( 1 );

	/// 아이템 설명 세팅
	LPCTSTR desc = itemDefine->GetDescription();
	if( desc )
	{
		CheckText( desc, eCOLOR_BLUE );
		AddGap( 1 );
	}

	/// 아이템 무게 세팅 
	SetText( GAMERESOURCEMAN->GetItemToolTipText( 2000701 ), (unsigned long)itemDefine->GetWeight(), eCOLOR_WHITE );

	/// 스토어 이면,
	if( bStore == false )
	{
		/// 판매가 세팅
		SetPrice( itemDefine->GetSellType(), itemDefine, 2000702, itemDefine->GetSellPrice() );
	}
	else
	{
		/// 구매가 세팅
		SetPrice( itemDefine->GetBuyType(), itemDefine, 2000704, itemDefine->GetBuyPrice() );
	}

	/// 아이템 분해 가능여부 세팅
	if( itemDefine->GetDisjoint() )
		SetText( GAMERESOURCEMAN->GetItemToolTipText( 2000705 ), eCOLOR_BLUE );

	/// 거래 가능 여부 세팅
	if( itemDefine->GetExchange() != 0 )
		SetText( GAMERESOURCEMAN->GetItemToolTipText( 2000711 ), eCOLOR_BLUE );
	/// Tip End
	//////////////////////////////////////////////////////////////////////////

	/// 배경 이미지 세팅
	SetBackImg( pos );

	return true;
}

/*
/// 아이템 팁 세팅
bool cItemTipWindow::SetItem( eTip_Kind tipkind, const cUIPos& pos, unsigned long itemIndex, int slotIndex, cUIRoundGauge* gauge )
{
	if( itemIndex == 0 )
		return false;

	cItemDefine* itemDefine = ITEMMAN->GetItemDefine( itemIndex );
	if( itemDefine == 0 )
		return false;

	/// 클리어 
	Clear();

	/// 게이지 세팅 
	mGauge = gauge;
	mItemIndex = itemIndex;
	mSlotIndex = slotIndex;

	if( tipkind == eTIP_ITEM )
	{
		/// 아이템관련창 호출
		eItemIn itemIn = ITEMMAN->GetItemIn( slotIndex );
		if( itemIn == ITEM_IN_NPCSTORE )
			SetNormalTip( itemDefine, true );
		else
			SetNormalTip( itemDefine );
	}
	else if( tipkind == eTIP_QUICK )
	{
		/// 퀵슬롯 
		SetNormalTip( itemDefine );
	}

	/// 배경 이미지 세팅
	SetBackImg( pos );
	return true;
}

bool cItemTipWindow::SetItem( eTip_Kind tipkind, const cUIPos& pos, unsigned long itemIndex, unsigned int enhance )
{
	if( itemIndex == 0 )
		return false;

	cItemDefine* itemDefine = ITEMMAN->GetItemDefine( itemIndex );
	if( itemDefine == 0 )
		return false;

	/// 클리어 
	Clear();

	if( tipkind != eTIP_ITEM )
		return true;

	/// 게이지 세팅 
	mItemIndex = itemIndex;

	/// 툴팁 세팅
	{
		/// 아이템명 설정 
		AddGap( 1 );
		SetName( itemDefine, enhance );

		/// 레어도 설정
		SetRare( itemDefine );
		AddGap( 1 );

		/// 아이템 분류 설정 
		unsigned char type = itemDefine->GetType();
		unsigned char subType = itemDefine->GetSubType();
		short defenseType = 0;

		cItemAbility* itemAbil = itemDefine->GetAbililty();
		if( itemAbil )
			defenseType = itemAbil->GetDefenseType();

		SetType( type, subType, defenseType );
		AddGap( 1 );

		/// 장착성 아이템 (장착용 카드 포함)
		if( type == ITEM_WEAPON || type == ITEM_WEAR || type == ITEM_ACCESSORY )
		{
			/// 아이템 기본 수치 설정
			if( SetBasic( itemDefine, enhance ) == true )
				AddGap( 1 );

			/// 아이템 추가 수치 설정
			if( SetSpecial( itemDefine ) == true )
				AddGap( 1 );
		}
		else if( type == ITEM_CARD && subType == ITEM_CARD_EQUIP_C )
		{
			/// 아이템 기본 수치 설정
			if( SetBasic( itemDefine, enhance ) == true )
				AddGap( 1 );

			/// 아이템 추가 수치 설정
			if( SetSpecialCard( itemDefine ) == true )
				AddGap( 1 );
		}
		else
		{
			/// 비장착성 아이템 
			/// 사용효과 설정
			if( SetEffect( itemDefine ) == true )
				AddGap( 1 );

			/// 재사용시간 설정
			if( SetUseTime( itemDefine ) == true )
				AddGap( 1 );
		}

		/// 아이템 제한 설정
		if( SetLimit( itemDefine ) == true )
			AddGap( 1 );

		/// 아이템 설명 세팅
		LPCTSTR desc = itemDefine->GetDescription();
		if( desc )
		{
			CheckText( desc, eCOLOR_BLUE );
			AddGap( 1 );
		}

		/// 아이템 무게 세팅 
		SetText( GAMERESOURCEMAN->GetItemToolTipText( 2000701 ), (unsigned long)itemDefine->GetWeight(), eCOLOR_WHITE );

		/// 판매가 세팅
		SetPrice( itemDefine->GetSellType(), itemDefine, 2000702, itemDefine->GetSellPrice() );

		/// 아이템 분해 가능여부 세팅
		if( itemDefine->GetDisjoint() )
			SetText( GAMERESOURCEMAN->GetItemToolTipText( 2000705 ), eCOLOR_BLUE );

		/// 거래 가능 여부 세팅
		if( itemDefine->GetExchange() != 0 )
			SetText( GAMERESOURCEMAN->GetItemToolTipText( 2000711 ), eCOLOR_BLUE );
	}

	/// 배경 이미지 세팅
	SetBackImg( pos );
	return true;
}

/// 다른 유저가 가진 아이템 정보
bool cItemTipWindow::SetOtherItem( eTip_Kind tipkind, const cUIPos& pos, sInventory& inven )
{
	if( inven.ItemIndex == 0 )
		return false;

	cItemDefine* itemDefine = ITEMMAN->GetItemDefine( inven.ItemIndex );
	if( itemDefine == 0 )
		return false;

	///
	Clear();

	if( tipkind != eTIP_ITEM )
		return true;

	/// 툴팁 세팅
	{
		/// 아이템명 설정 
		AddGap( 1 );
		SetName( itemDefine, inven.enhanced );

		/// 레어도 설정
		SetRare( itemDefine );
		AddGap( 1 );

		/// 아이템 분류 설정 
		unsigned char type = itemDefine->GetType();
		unsigned char subType = itemDefine->GetSubType();
		short defenseType = 0;

		cItemAbility* itemAbil = itemDefine->GetAbililty();
		if( itemAbil )
			defenseType = itemAbil->GetDefenseType();

		SetType( type, subType, defenseType );
		AddGap( 1 );

		/// 장착성 아이템 (장착용 카드 포함)
		if( type == ITEM_WEAPON || type == ITEM_WEAR || type == ITEM_ACCESSORY )
		{
			/// 아이템 기본 수치 설정
			if( SetBasic( itemDefine, inven.enhanced ) == true )
				AddGap( 1 );

			/// 아이템 추가 수치 설정
			if( SetSpecial( itemDefine ) == true )
				AddGap( 1 );
		}
		else if( type == ITEM_CARD && subType == ITEM_CARD_EQUIP_C )
		{
			/// 아이템 기본 수치 설정
			if( SetBasic( itemDefine, inven.enhanced ) == true )
				AddGap( 1 );

			/// 아이템 추가 수치 설정
			if( SetSpecialCard( itemDefine ) == true )
				AddGap( 1 );
		}
		else
		{
			/// 비장착성 아이템 
			/// 사용효과 설정
			if( SetEffect( itemDefine ) == true )
				AddGap( 1 );

			/// 재사용시간 설정
			if( SetUseTime( itemDefine ) == true )
				AddGap( 1 );
		}

		/// 카드이미지 세팅
		SetCard( inven );

		/// 아이템 제한 설정
		if( SetLimit( itemDefine ) == true )
			AddGap( 1 );

		/// 아이템 설명 세팅
		LPCTSTR desc = itemDefine->GetDescription();
		if( desc )
		{
			CheckText( desc, eCOLOR_BLUE );
			AddGap( 1 );
		}
		
		/// 아이템 무게 세팅 
		SetText( GAMERESOURCEMAN->GetItemToolTipText( 2000701 ), (unsigned long)itemDefine->GetWeight(), eCOLOR_WHITE );

		/// 판매가 세팅
		SetPrice( itemDefine->GetSellType(), itemDefine, 2000702, itemDefine->GetSellPrice() );

		/// 아이템 분해 가능여부 세팅
		if( itemDefine->GetDisjoint() )
			SetText( GAMERESOURCEMAN->GetItemToolTipText( 2000705 ), eCOLOR_BLUE );

		/// 거래 가능 여부 세팅
		if( itemDefine->GetExchange() != 0 )
			SetText( GAMERESOURCEMAN->GetItemToolTipText( 2000711 ), eCOLOR_BLUE );
	}

	/// 배경 이미지 세팅
	SetBackImg( pos );
	return true;
}
*/
/*
///
void cItemTipWindow::SetNormalTip( cItemDefine* itemDefine, bool store )
{
	/// 아이템명 설정 
	AddGap( 1 );
	SetName( itemDefine );

	/// 레어도 설정
	SetRare( itemDefine );
	AddGap( 1 );

	/// 아이템 분류 설정 
	unsigned char type = itemDefine->GetType();
	unsigned char subType = itemDefine->GetSubType();
	short defenseType = 0;
	
	cItemAbility* itemAbil = itemDefine->GetAbililty();
	if( itemAbil )
		defenseType = itemAbil->GetDefenseType();

	SetType( type, subType, defenseType );
	AddGap( 1 );

	/// 장착성 아이템
	if( type == ITEM_WEAPON || type == ITEM_WEAR || type == ITEM_ACCESSORY )
	{
		/// 아이템 기본 수치 설정
		if( SetBasic( itemDefine ) == true )
			AddGap( 1 );

		/// 아이템 추가 수치 설정
		if( SetSpecial( itemDefine ) == true )
			AddGap( 1 );
	}
	else if( type == ITEM_CARD && subType == ITEM_CARD_EQUIP_C )
	{
		/// 아이템 기본 수치 설정
        if( SetBasic( itemDefine ) == true )
			AddGap( 1 );

		/// 아이템 추가 수치 설정
		if( SetSpecialCard( itemDefine ) == true )
			AddGap( 1 );
	}
	else
	{
		/// 비장착성 아이템 
		/// 사용효과 설정
		if( SetEffect( itemDefine ) == true )
			AddGap( 1 );

		/// 재사용시간 설정
		if( SetUseTime( itemDefine ) == true )
			AddGap( 1 );
	}

	/// 카드정보세팅
	if( store == false )
		SetCard();
	
	/// 아이템 제한 설정
	if( SetLimit( itemDefine ) == true )
		AddGap( 1 );

	/// 아이템 설명 세팅
	LPCTSTR desc = itemDefine->GetDescription();
	if( desc )
	{
		CheckText( desc, eCOLOR_BLUE );
		AddGap( 1 );
	}

	/// 아이템 무게 세팅 
	SetText( GAMERESOURCEMAN->GetItemToolTipText( 2000701 ), (unsigned long)itemDefine->GetWeight(), eCOLOR_WHITE );

	/// 스토어 이면,
	if( store == false )
	{
		/// 판매가 세팅
		SetPrice( itemDefine->GetSellType(), itemDefine, 2000702, itemDefine->GetSellPrice() );
	}
	else
	{
		/// 구매가 세팅
		SetPrice( itemDefine->GetBuyType(), itemDefine, 2000704, itemDefine->GetBuyPrice() );
	}

	/// 아이템 분해 가능여부 세팅
	if( itemDefine->GetDisjoint() )
		SetText( GAMERESOURCEMAN->GetItemToolTipText( 2000705 ), eCOLOR_BLUE );

	/// 거래 가능 여부 세팅
	if( itemDefine->GetExchange() != 0 )
		SetText( GAMERESOURCEMAN->GetItemToolTipText( 2000711 ), eCOLOR_BLUE );

}
*/

/// 배경 이미지 세팅
void cItemTipWindow::SetBackImg( const cUIPos& pos )
{
	/// 최소 너비 제한 설정
	if( mMaxWidth < mLimitMinWidth )
		mMaxWidth = mLimitMinWidth;

	/// 최대 너비 제한 설정
	if( mMaxWidth > mLimitMaxWidth )
		mMaxWidth = mLimitMaxWidth;

	/// 세팅
	mX = pos.mX + 25;
	mY = pos.mY + 25;
	unsigned int w = mMaxWidth + GAP_SIZE * 2; 
	unsigned int h = mIndex * mLineHeight + (mGapCount*GAP_SIZE);

	/// 카드가 있으면 카드 넓이만큼 더 세팅
	if( mSlotCount > 0 )
	{
		unsigned int cardWidth = mSlotCount * ( mSlotSize.mWidth + SLOT_GAP + GAP_SIZE );

		if( cardWidth > w )
			w = cardWidth;
	}

	/// 화면 안벗어나게 조정
	if( mX + w > GetScreenWidth() )
	{	
		mX -= ((mX + w) - GetScreenWidth());
	}

	if( mY + h > GetScreenHeight() )
	{
		mY -= ((mY + h) - GetScreenHeight());
	}

	mMiddleBack->SetScreenRect( (short)mX, (short)mY, (unsigned short)w, (unsigned short)h );
	mMiddleBack->SetColorA( 0.6f, 0.6f, 0.6f, 0.6f );
	SetRelativePos( cUIPos( mX, mY ) );

	/// 카드 이미지 위치 세팅
	for( unsigned int i = 0; i < mSlotCount; ++i )
	{
		if( mShowImage && mImage[i] && mSlotImage[i] )
		{
			unsigned int ygap = mSlotImage[i]->GetHeight() - mImage[i]->GetHeight();

			/// 카드이미지위치에 따라 카드슬롯이미지 세팅
			unsigned int x = mX + ( i * (mSlotImage[i]->GetWidth()+GAP_SIZE) ) + GAP_SIZE;
			unsigned int y = mImagePosY + mY;
			mSlotImage[i]->SetPos( x, y );

			/// 슬롯이미지의 일정픽셀 더해서 찍는다 (중앙에출력하기위함)
			mImage[i]->SetPos( x + SLOT_GAP, y + ygap - SLOT_GAP );
		}
	}
}
/*
///
void cItemTipWindow::SetCard()
{
	cItemDefine* define = ITEMMAN->GetItemDefine( mItemIndex );
	if( !define )
	{
		assert(0);
		return;
	}

	/// 무기, 방어구 타입 아니면 리턴
	if( !(define->GetType() == ITEM_WEAPON || define->GetType() == ITEM_WEAR) )
		return;

	/// 슬롯 존재여부 판단
	mSlotCount = define->GetPutSlotCount();
	if( mSlotCount == 0 )
		return;

	//AddGap( 1 );

	/// 이미지 출력 위치 저장
	mImagePosY = mIndex * mLineHeight + (mGapCount*GAP_SIZE);

	/// 슬롯 형태 세팅
	sItemPutCardSlot* data = define->GetPutCard();
	if( data )
	{
		cUIPos texpos;
		for( unsigned int i = 0; i < mSlotCount; ++i )
		{
			switch( data->mSlotType[i] )
			{
			case ITEM_CARD_SLOT_NONE:	continue;
			case ITEM_CARD_SLOT_A:	texpos = mTexPos[0]; break;
			case ITEM_CARD_SLOT_B:	texpos = mTexPos[1]; break;
			case ITEM_CARD_SLOT_AB:	texpos = mTexPos[2]; break;
			case ITEM_CARD_SLOT_O:	texpos = mTexPos[3]; break;
			}

			if( mSlotImage[i] )
				mSlotImage[i]->SetTextureRect( cUIRect(texpos.mX, texpos.mY, texpos.mX + mSlotSize.mWidth, texpos.mY + mSlotSize.mHeight ) );
		}
	}

	AddGap( 8 );

	/// 실제 장착된 카드 이미지 세팅
	if( !(mSlotIndex > MAX_INVENTORY) )
	{
		cItem& item = ITEMMAN->GetItem( mSlotIndex );

		SetCardData( 0, item.GetCardIndex1() );
		SetCardData( 1, item.GetCardIndex2() );
		SetCardData( 2, item.GetCardIndex3() );
		SetCardData( 3, item.GetCardIndex4() );
		SetCardData( 4, item.GetCardIndex5() );

		AddGap( 1 );
	}
}
*/
void cItemTipWindow::SetCard( sInventory& inven )
{
	cItemDefine* define = ITEMMAN->GetItemDefine( inven.ItemIndex );
	if( !define )
	{
		assert(0);
		return;
	}

	/// 무기, 방어구 타입 아니면 리턴
	if( !(define->GetType() == ITEM_WEAPON || define->GetType() == ITEM_WEAR) )
		return;

	/// 슬롯 존재여부 판단
	mSlotCount = define->GetPutSlotCount();
	if( mSlotCount == 0 )
		return;

	//AddGap( 1 );

	/// 이미지 출력 위치 저장
	mImagePosY = mIndex * mLineHeight + (mGapCount*GAP_SIZE);

	/// 슬롯 형태 세팅
	sItemPutCardSlot* data = define->GetPutCard();
	if( data )
	{
		cUIPos texpos;
		for( unsigned int i = 0; i < mSlotCount; ++i )
		{
			switch( data->mSlotType[i] )
			{
			case ITEM_CARD_SLOT_NONE:	continue;
			case ITEM_CARD_SLOT_A:	texpos = mTexPos[0]; break;
			case ITEM_CARD_SLOT_B:	texpos = mTexPos[1]; break;
			case ITEM_CARD_SLOT_AB:	texpos = mTexPos[2]; break;
			case ITEM_CARD_SLOT_O:	texpos = mTexPos[3]; break;
			}

			if( mSlotImage[i] )
				mSlotImage[i]->SetTextureRect( cUIRect(texpos.mX, texpos.mY, texpos.mX + mSlotSize.mWidth, texpos.mY + mSlotSize.mHeight ) );
		}
	}

	AddGap( 8 );

	/// 장착된 카드 이미지 세팅
	SetCardData( 0, inven.cardSlot1 );
	SetCardData( 1, inven.cardSlot2 );
	SetCardData( 2, inven.cardSlot3 );
	SetCardData( 3, inven.cardSlot4 );
	SetCardData( 4, inven.cardSlot5 );

	/// 하나라도 세팅되면 갭 넣기
	AddGap( 1 );
}

bool cItemTipWindow::SetCardData( int i, unsigned long cardIndex )
{
	if( cardIndex == 0 )
		return false;

	cItemDefine* cardDefine = ITEMMAN->GetItemDefine( cardIndex );
	if( !cardDefine )
		return false;

	/// 카드 이름 세팅
	/// 글씨 컬러 정하기
	unsigned long color = eCOLOR_WHITE;
	ITEMMAN->GetTooltipColor( cardDefine->GetTipType(), color );

	/// 카드이미지 세팅
	cIconParam* param = cardDefine->GetIconParam();
	if( param )
	{
		mImage[i]->SetTexture( param->mpTexture );
		mImage[i]->SetTextureRect( cUIRect( param->mTexPos.mX, param->mTexPos.mY, 
			param->mTexPos.mX + 28, param->mTexPos.mY + 28 ) );

		mShowImage[i] = true;
	}

	/// 카드 설명 세팅
	cItemAbility* pAbil = cardDefine->GetAbililty();
	if( pAbil )
	{
		TCHAR temp[256] = {0,};
		LPCTSTR name = cardDefine->GetName();
		long index = pAbil->GetDescription();

		::_stprintf( temp, _T("%s: %s"), cardDefine->GetName(), GAMERESOURCEMAN->GetItemToolTipText( index ) );
		SetText( temp, color );
	}
	
	return true;
}


///////////
cChatTipWindow::cChatTipWindow()
: mpClose(0)
{

}

cChatTipWindow::~cChatTipWindow()
{

}

bool cChatTipWindow::OnCreate( cUINodeProperty* prop )
{
	if( cUIWindow::OnCreate( prop ) == false )
		return false;

	mpClose = GetChild( eUIID_CHATTIP_CLOSE );

	/// 슬롯 타입 이미지 읽기
	cUISkin* pSkin = UIMAN->GetSkin();
	if( !pSkin )
	{
		assert(0);
		return false;
	}

	cString str;
	NiTexture* texture = 0;
	for( unsigned int i = 0; i < MAX_CARD_SLOT-1; ++i )
	{
		str.Format( "PutCard_SlotType%d", i );
		cUINodeSkin* pSlotSkin = pSkin->GetNodeSkin( str );
		if( pSlotSkin )
		{
			mTexPos[i].mX = pSlotSkin->mSkinInfo->mTexX;
			mTexPos[i].mY = pSlotSkin->mSkinInfo->mTexY;

			texture = pSlotSkin->mpTexture;
		}
	}

	if( !texture )
	{
		assert(0);
		return false;
	}

	/// 이미지 생성
	cUINodeSkin* imgSkin = pSkin->GetNodeSkin( "PutCard_Slot0" );
	if( !imgSkin )
		return false;

	for( int i = 0; i < MAX_CARD_SLOT; ++i )
	{
		mImage[i] = new cUIImage;
		unsigned int x = imgSkin->mSkinInfo->mX;
		unsigned int y = imgSkin->mSkinInfo->mY;
		unsigned int w = imgSkin->mSkinInfo->mWidth;
		unsigned int h = imgSkin->mSkinInfo->mHeight;
		mImage[i]->SetScreenRect( cUIRect( x, y, x + w, y + h ) );
	}

	/// 슬롯 이미지 생성
	for( int i = 0; i < MAX_CARD_SLOT; ++i )
	{
		str.Format( "PutCard_SlotPos%d", i );
		imgSkin = pSkin->GetNodeSkin( str );
		if( imgSkin && texture )
		{
			mSlotImage[i] = new cUIImage( texture );
			unsigned int x = imgSkin->mSkinInfo->mX;
			unsigned int y = imgSkin->mSkinInfo->mY;
			mSlotSize.mWidth = imgSkin->mSkinInfo->mWidth;
			mSlotSize.mHeight = imgSkin->mSkinInfo->mHeight;
			mSlotImage[i]->SetScreenRect( cUIRect(x, y, x+mSlotSize.mWidth, y+mSlotSize.mHeight) );
		}
	}
	return true;
}

void cChatTipWindow::UpdateRect()
{
	cUIWindow::UpdateRect();

	if( mMiddleBack )
	{
		mX = GetAbsoluteRect().mLeft;
		mY = GetAbsoluteRect().mTop;
		mMiddleBack->SetScreenXY( mX, mY );

		/// 카드 이미지 위치 세팅
		for( unsigned int i = 0; i < mSlotCount; ++i )
		{
			if( mShowImage && mImage[i] && mSlotImage[i] )
			{
				unsigned int ygap = mSlotImage[i]->GetHeight() - mImage[i]->GetHeight();

				/// 카드이미지위치에 따라 카드슬롯이미지 세팅
				unsigned int x = mX + ( i * (mSlotImage[i]->GetWidth()+GAP_SIZE) ) + GAP_SIZE;
				unsigned int y = mImagePosY + mY;
				mSlotImage[i]->SetPos( x, y );

				/// 슬롯이미지의 일정픽셀 더해서 찍는다 (중앙에출력하기위함)
				mImage[i]->SetPos( x + SLOT_GAP, y + ygap - SLOT_GAP );
			}
		}
	}
}

void cChatTipWindow::UpdateSkin()
{
	cUIWindow::UpdateSkin();

	unsigned int w = mMaxWidth + GAP_SIZE * 2; 
	unsigned int h = mIndex * mLineHeight + (mGapCount*GAP_SIZE);

	/// 추가 세팅
	if( mpClose )
	{
		int x = w - mpClose->GetRelativeRect().GetWidth() - 2;
		mpClose->SetRelativePos( cUIPos(x, 2) );
	}

	SetRelativeSize( cUISize( w, h ) );
	mCaptionRect.Set( 0, 0, w, h );
}

void cChatTipWindow::OnRender( cUIFontItemKeeper* fontKeeper )
{	
	if( mVisible == false )
		return;

	/// 배경
	mMiddleBack->Draw();

	/// 자식 렌더링
	cChildList::cIterator i = mChildList.Begin();
	cChildList::cIterator end = mChildList.End();

	for( ; i != end; ++i )
	{
		if( ((cUINode*)(*i))->IsVisible() == true )
			((cUINode*)(*i))->OnRender(fontKeeper);
	}

	///
	if( mSlotCount > 0 )
	{
		for( unsigned int i = 0; i < mSlotCount; ++i )
		{
			if( mSlotImage[i] )
				mSlotImage[i]->Draw();

			if( mImage[i] && mShowImage[i] == true )
				mImage[i]->Draw();
		}
	}

	int px = mX + GAP_SIZE;
	int py = mY;

	/// 데이터 출력 
	for( unsigned int row = 0; row < mIndex; ++row )
	{
		cStringT& str = mToolTip[row].mString;
		if( str.IsEmpty() )
			continue;

		py += mToolTip[row].mGapCount * GAP_SIZE;

		/// 다음줄 출력 
		unsigned int color = mToolTip[row].mColor;
		fontKeeper->AddFontItem( cFontAgent::eFont_System, (LPCTSTR)str.Cstr(), px, py, color );

		py += mLineHeight;
	}

	///
	fontKeeper->DrawAll();
}

void cChatTipWindow::OnCommand(cUINode* , unsigned int id )
{
	if( id == eUIID_CHATTIP_CLOSE )
		Hide();
}

/// 배경 이미지 세팅
void cChatTipWindow::SetBackImg( const cUIPos& pos )
{
	if( !mpClose )
		assert(0);

	/// 최소 너비 제한 설정
	if( mMaxWidth < mLimitMinWidth )
		mMaxWidth = mLimitMinWidth;

	/// 최대 너비 제한 설정
	if( mMaxWidth > mLimitMaxWidth )
		mMaxWidth = mLimitMaxWidth;

	/// 세팅
	mX = GetRelativeRect().mLeft;
	mY = GetRelativeRect().mTop;
	unsigned int w = mMaxWidth + GAP_SIZE * 2;
	unsigned int h = mIndex * mLineHeight + (mGapCount*GAP_SIZE);

	if( mpClose )
		w += mpClose->GetRelativeRect().GetWidth();

	/// 카드가 있으면 카드 넓이만큼 더 세팅
	if( mSlotCount > 0 )
	{
		unsigned int cardWidth = mSlotCount * ( mSlotSize.mWidth + SLOT_GAP + GAP_SIZE );

		if( cardWidth > w )
			w = cardWidth;
	}

	SetRelativeSize( cUISize( w, h ) );
	mCaptionRect.Set( 0, 0, w, h );

	mMiddleBack->SetScreenRect( (short)mX, (short)mY, (unsigned short)w, (unsigned short)h );
	mMiddleBack->SetColorA( 0.6f, 0.6f, 0.6f, 0.6f );

	/// 카드 이미지 위치 세팅
	for( unsigned int i = 0; i < mSlotCount; ++i )
	{
		if( mShowImage && mImage[i] && mSlotImage[i] )
		{
			unsigned int ygap = mSlotImage[i]->GetHeight() - mImage[i]->GetHeight();

			/// 카드이미지위치에 따라 카드슬롯이미지 세팅
			unsigned int x = mX + ( i * (mSlotImage[i]->GetWidth()+GAP_SIZE) ) + GAP_SIZE;
			unsigned int y = mImagePosY + mY;
			mSlotImage[i]->SetPos( x, y );

			/// 슬롯이미지의 일정픽셀 더해서 찍는다 (중앙에출력하기위함)
			mImage[i]->SetPos( x + SLOT_GAP, y + ygap - SLOT_GAP );
		}
	}

	/// 추가 세팅
	if( mpClose )
	{
		int x = w - mpClose->GetRelativeRect().GetWidth() - 2;
		mpClose->SetRelativePos( cUIPos(x, 2) );
	}
}
