#ifdef PRECOMPILEDHEADERS
	#include "Laptop All.h"
#else
	#include "CharProfile.h"
	#include "IMP Voices.h"
	#include "IMP MainPage.h"
	#include "IMPVideoObjects.h"
	#include "Utilities.h"
	#include "input.h"
	#include "Isometric Utils.h"
	#include "Debug.h"
	#include "WordWrap.h"
	#include "Encrypted File.h"
	#include "cursors.h"
	#include "laptop.h"
	#include "Sound Control.h"
	#include "IMP Text System.h"
	#include "text.h"
	#include "soldier profile type.h"
	#include "GameSettings.h"
	#include "LaptopSave.h"
	#include "IMP Confirm.h"
#endif

INT32 iCurrentVoice = 0;
UINT32 iSelectedIMPVoiceSet = 0;

UINT32 uiVocVoiceSound = 0;
// buttons needed for the IMP Voices screen
INT32 giIMPVoicesButton[ 3 ];
INT32 giIMPVoicesButtonImage[ 3 ];

// redraw protrait screen
BOOLEAN fReDrawVoicesScreenFlag = FALSE;

// the portrait region, for player to click on and re-hear voice
MOUSE_REGION gVoicePortraitRegion;

// function definitions
void IncrementVoice( void );
void DecrementVoice( void );
void CreateIMPVoicesButtons( void );
void DestroyIMPVoicesButtons( void );
void CreateIMPVoiceMouseRegions( void );
void DestroyIMPVoiceMouseRegions( void );
void RenderVoiceIndex( void );
BOOLEAN CameBackToVoicePageButNotFinished();

// callbacks
void BtnIMPVoicesNextCallback(GUI_BUTTON *btn,INT32 reason);
void BtnIMPVoicesPreviousCallback(GUI_BUTTON *btn,INT32 reason);
void BtnIMPVoicesDoneCallback(GUI_BUTTON *btn,INT32 reason);
void IMPPortraitRegionButtonCallback(MOUSE_REGION * pRegion, INT32 iReason );

void EnterIMPVoices( void )
{
	// Set the initial voice
	for ( int i = 0; i < gIMPVoice.size(); ++i )
	{
		// MALE is 0, FEMALE is 1, thus the negation
		if ( gIMPVoice[i].exists && !fCharacterIsMale == gIMPVoice[i].bSex )
		{
			iCurrentVoice = i;
			break;
		}
	}
	
	// create buttons
	CreateIMPVoicesButtons( );

	// create mouse regions
	CreateIMPVoiceMouseRegions( );

	// render background
	RenderIMPVoices( );

	// play voice once
	uiVocVoiceSound = PlayVoice( );
}

void RenderIMPVoices( void )
{
	// render background
	RenderProfileBackGround( );

	// the Voices frame
	RenderPortraitFrame( 191, 167 );

	// the sillouette
	RenderLargeSilhouette( 200, 176 );

	// indent for the text
	RenderAttrib1IndentFrame( 128, 65);

	// render voice index value
	RenderVoiceIndex( );

	// text
	PrintImpText( );
}

void ExitIMPVoices( void )
{
	// destroy buttons for IMP Voices page
	DestroyIMPVoicesButtons( );

	// destroy mouse regions for this screen
	DestroyIMPVoiceMouseRegions( );
}

void HandleIMPVoices( void )
{
	// do we need to re write screen
	if ( fReDrawVoicesScreenFlag == TRUE )
	{
		RenderIMPVoices( );

		// reset redraw flag
		fReDrawVoicesScreenFlag = FALSE;
	}
}

void IncrementVoice()
{
	++iCurrentVoice;
	
	for ( int i = iCurrentVoice; i < gIMPVoice.size( ); ++i )
	{
		if ( gIMPVoice[i].exists && !fCharacterIsMale == gIMPVoice[i].bSex )
		{
			iCurrentVoice = i;
			return;
		}
	}

	// still here? Start from the beginning then
	for ( int i = 0; i < gIMPVoice.size( ); ++i )
	{
		if ( gIMPVoice[i].exists && !fCharacterIsMale == gIMPVoice[i].bSex )
		{
			iCurrentVoice = i;
			return;
		}
	}
}

void DecrementVoice( void )
{
	--iCurrentVoice;

	for ( int i = iCurrentVoice; i > 0; --i )
	{
		if ( gIMPVoice[i].exists && !fCharacterIsMale == gIMPVoice[i].bSex )
		{
			iCurrentVoice = i;
			return;
		}
	}

	// still here? Start from the beginning then
	for ( int i = gIMPVoice.size( ) - 1; i > 0; --i )
	{
		if ( gIMPVoice[i].exists && !fCharacterIsMale == gIMPVoice[i].bSex )
		{
			iCurrentVoice = i;
			return;
		}
	}
}

void CreateIMPVoicesButtons( void )
{
	// will create buttons need for the IMP Voices screen

	// next button
	giIMPVoicesButtonImage[0]=	LoadButtonImage( "LAPTOP\\voicearrows.sti" ,-1,1,-1,3,-1 );
	/*giIMPVoicesButton[0] = QuickCreateButton( giIMPVoicesButtonImage[0], LAPTOP_SCREEN_UL_X +	( 18 ), LAPTOP_SCREEN_WEB_UL_Y + ( 184 ),
										BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
										BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPVoicesNextCallback );
	*/
	giIMPVoicesButton[0] = CreateIconAndTextButton( giIMPVoicesButtonImage[0], pImpButtonText[ 13 ], FONT12ARIAL,
														FONT_WHITE, DEFAULT_SHADOW,
														FONT_WHITE, DEFAULT_SHADOW,
														TEXT_CJUSTIFIED,
														LAPTOP_SCREEN_UL_X +	( 343 ), LAPTOP_SCREEN_WEB_UL_Y + ( 205 ),BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
															BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPVoicesNextCallback);
	
	// previous button
	giIMPVoicesButtonImage[ 1 ]=	LoadButtonImage( "LAPTOP\\voicearrows.sti" ,-1,0,-1,2,-1 );
/*	giIMPVoicesButton[ 1 ] = QuickCreateButton( giIMPVoicesButtonImage[ 1 ], LAPTOP_SCREEN_UL_X +	( 18 ), LAPTOP_SCREEN_WEB_UL_Y + ( 254 ),
										BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
										BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPVoicesPreviousCallback );
	*/
	giIMPVoicesButton[ 1 ] = CreateIconAndTextButton( giIMPVoicesButtonImage[ 1 ], pImpButtonText[ 12 ], FONT12ARIAL,
														FONT_WHITE, DEFAULT_SHADOW,
														FONT_WHITE, DEFAULT_SHADOW,
														TEXT_CJUSTIFIED,
														LAPTOP_SCREEN_UL_X +	( 93), LAPTOP_SCREEN_WEB_UL_Y + ( 205 ), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
														BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPVoicesPreviousCallback);
	
	// done button
	giIMPVoicesButtonImage[ 2 ]=	LoadButtonImage( "LAPTOP\\button_5.sti" ,-1,0,-1,1,-1 );
	/* giIMPVoicesButton[ 2 ] = QuickCreateButton( giIMPVoicesButtonImage[ 1 ], LAPTOP_SCREEN_UL_X +	( 349 ), LAPTOP_SCREEN_WEB_UL_Y + ( 220 ),
										BUTTON_TOGGLE, MSYS_PRIORITY_HIGHEST - 1,
										BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPVoicesDoneCallback );
	*/
	giIMPVoicesButton[ 2 ] = CreateIconAndTextButton( giIMPVoicesButtonImage[ 2 ], pImpButtonText[ 13 ], FONT12ARIAL,	// changed text on button to [13]("Next") - SANDRO
														FONT_WHITE, DEFAULT_SHADOW,
														FONT_WHITE, DEFAULT_SHADOW,
														TEXT_CJUSTIFIED,
														LAPTOP_SCREEN_UL_X +	( 187 ), LAPTOP_SCREEN_WEB_UL_Y + ( 330 ), BUTTON_TOGGLE, MSYS_PRIORITY_HIGH,
															BtnGenericMouseMoveButtonCallback, (GUI_CALLBACK)BtnIMPVoicesDoneCallback);
		
	SetButtonCursor(giIMPVoicesButton[0], CURSOR_WWW);
	SetButtonCursor(giIMPVoicesButton[1], CURSOR_WWW);
	SetButtonCursor(giIMPVoicesButton[2], CURSOR_WWW);
}


void DestroyIMPVoicesButtons( void )
{
	// will destroy buttons created for IMP Voices screen

	// the next button
	RemoveButton( giIMPVoicesButton[0] );
	UnloadButtonImage( giIMPVoicesButtonImage[0] );

	// the previous button
	RemoveButton( giIMPVoicesButton[1] );
	UnloadButtonImage( giIMPVoicesButtonImage[1] );

	// the done button
	RemoveButton( giIMPVoicesButton[2] );
	UnloadButtonImage( giIMPVoicesButtonImage[2] );
}


void BtnIMPVoicesNextCallback( GUI_BUTTON *btn, INT32 reason )
{
	// btn callback for IMP attrbite begin button
	if ( !(btn->uiFlags & BUTTON_ENABLED) )
		return;

	if ( reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
	{
		btn->uiFlags |= (BUTTON_CLICKED_ON);
	}
	else if ( reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
	{
		if ( btn->uiFlags & BUTTON_CLICKED_ON )
		{
			btn->uiFlags &= ~(BUTTON_CLICKED_ON);

			// next voice!!
			IncrementVoice( );
			// play voice
			if ( !SoundIsPlaying( uiVocVoiceSound ) )
			{
				uiVocVoiceSound = PlayVoice( );
			}
			else
			{
				SoundStop( uiVocVoiceSound );
				uiVocVoiceSound = PlayVoice( );
			}

			fReDrawVoicesScreenFlag = TRUE;
		}
	}
}

void BtnIMPVoicesPreviousCallback( GUI_BUTTON *btn, INT32 reason )
{
	// btn callback for IMP attrbite begin button
	if ( !(btn->uiFlags & BUTTON_ENABLED) )
		return;

	if ( reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
	{
		btn->uiFlags |= (BUTTON_CLICKED_ON);
	}
	else if ( reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
	{
		if ( btn->uiFlags & BUTTON_CLICKED_ON )
		{
			btn->uiFlags &= ~(BUTTON_CLICKED_ON);

			// previous voice, please!!!
			DecrementVoice( );
			// play voice
			if ( !SoundIsPlaying( uiVocVoiceSound ) )
			{
				uiVocVoiceSound = PlayVoice( );
			}
			else
			{
				SoundStop( uiVocVoiceSound );
				uiVocVoiceSound = PlayVoice( );
			}

			fReDrawVoicesScreenFlag = TRUE;
		}
	}
}

void BtnIMPVoicesDoneCallback( GUI_BUTTON *btn, INT32 reason )
{
	// btn callback for IMP attrbite begin button
	if ( !(btn->uiFlags & BUTTON_ENABLED) )
		return;

	if ( reason & MSYS_CALLBACK_REASON_LBUTTON_DWN )
	{
		btn->uiFlags |= (BUTTON_CLICKED_ON);
	}
	else if ( reason & MSYS_CALLBACK_REASON_LBUTTON_UP )
	{
		if ( btn->uiFlags & BUTTON_CLICKED_ON )
		{
			btn->uiFlags &= ~(BUTTON_CLICKED_ON);

			// Changed to continue to color choosing - SANDRO
			iCurrentImpPage = IMP_COLOR_CHOICE_PAGE;
			
			iSelectedIMPVoiceSet = gIMPVoice[iCurrentVoice].voiceset;

			// set button up image	pending
			fButtonPendingFlag = TRUE;
		}
	}
}

BOOLEAN CameBackToVoicePageButNotFinished( )
{
	//if we are in a page that comes after this one
	if ( iCurrentProfileMode == IMP__PERSONALITY || iCurrentProfileMode == IMP__ATTRIBUTES )
	{
		return(TRUE);
	}

	return(FALSE);
}


UINT32 PlayVoice( void )
{
	CHAR8 zFileName[164];
	CHAR8 zFileNameHelp[164];

	UINT16 iSlot = gIMPVoice[iCurrentVoice].voiceset;
	Assert( (iSlot >= 0) && (iSlot <= 999) );

	sprintf( zFileNameHelp, "Speech\\%03d_001", iSlot );

	SoundFileExists( zFileNameHelp, zFileName );

	return(PlayJA2SampleFromFile( zFileName, RATE_11025, MIDVOLUME, 1, MIDDLEPAN ));
}

void CreateIMPVoiceMouseRegions( void )
{
	// will create mouse regions needed for the IMP voices page
	MSYS_DefineRegion( &gVoicePortraitRegion, LAPTOP_SCREEN_UL_X + 200, LAPTOP_SCREEN_WEB_UL_Y + 176, LAPTOP_SCREEN_UL_X + 200 + 100, LAPTOP_SCREEN_WEB_UL_Y + 176 + 100, MSYS_PRIORITY_HIGH,
					   MSYS_NO_CURSOR, MSYS_NO_CALLBACK, IMPPortraitRegionButtonCallback );

	MSYS_AddRegion( &gVoicePortraitRegion );
}

void DestroyIMPVoiceMouseRegions( void )
{
	// will destroy already created mouse reiogns for IMP voices page
	MSYS_RemoveRegion( &gVoicePortraitRegion );
}

void IMPPortraitRegionButtonCallback( MOUSE_REGION * pRegion, INT32 iReason )
{
	// callback handler for imp portrait region button events

	if ( iReason & MSYS_CALLBACK_REASON_INIT )
	{
		return;
	}
	if ( iReason & MSYS_CALLBACK_REASON_LBUTTON_UP )
	{
		if ( !SoundIsPlaying( uiVocVoiceSound ) )
		{
			uiVocVoiceSound = PlayVoice( );
		}
	}
}

void RenderVoiceIndex( void )
{
	CHAR16 sString[100];
	INT16 sX, sY;

	// render the voice index value on the the blank portrait
	swprintf( sString, L"%s", gIMPVoice[iCurrentVoice].szVoiceSetName );

	FindFontCenterCoordinates( 290 + LAPTOP_UL_X, 0, 100, 0, sString, FONT12ARIAL, &sX, &sY );

	SetFont( FONT12ARIAL );
	SetFontForeground( FONT_WHITE );
	SetFontBackground( FONT_BLACK );

	mprintf( sX, iScreenHeightOffset + 320, sString );
}
