
/*******************************************************************************

					CONDAT (UK)

********************************************************************************                                                                              

 This software product is the property of Condat (UK) Ltd and may not be
 disclosed to any third party without the express permission of the owner.                                 
                                                                              
********************************************************************************

 $Project name:	Basic MMI                                                      
 $Project code:	BMI (6349)                                                           
 $Module:		MmiDialogs
 $File:		    MmiDialogs.c
 $Revision:		1.0                                                       
                                                                              
 $Author:		Condat(UK)                                                         
 $Date:		    25/10/00                                                      
                                                                               
********************************************************************************
                                                                              
 Description:MMI Information dialogue handling.
 

                        
********************************************************************************

 $History: MmiDialogs.c

	Mar 11, 2006   REF:DR:OMAPS00061467  x0035544
	Description:   27.22.4.13.3 SET UP CALL (display of icons) fails.
	Solution: Assigned the default values for icon data  for the structure display_info in the function 
	dlg_zeroDisplayData(). copied icon data in to the structure data->IconData and provided functionality 
	in the function dialog_info_win_resize_cb() to display icon data appropriately on the dialog screen for SAT
	call setup.
	
       Sep 06 2005  REF:  MMI-SPR-33548  x0012849 Jagan
       Description : A dialog  with long message  is not displayed properly.
       Solution : The no of lines in a dialog is increased from 4 to 15.
       
 	Feb 24, 2005 REF: CRR MMI-SPR-29102 xnkulkar
       Description: The phone resets when user presses the ''End All' key while the SMSs are being deleted. 
       Solution: As the user has already confirmed that all SMS messages are to be deleted, ''End All' key 
       		press is ignored till the delete operation is over.
            xrashmic 08 Feb, 2005 MMI-SPR-27853
       Moved the T_dialog_info structure from MmiDialogs.c to MmiDialogs.h     


       xrashmic 08 Feb, 2005 MMI-SPR-27853
       Moved the T_dialog_info structure from MmiDialogs.c to MmiDialogs.h     

	Aug 25, 2004    REF: CRR 24904   Deepa M.D
	Bug:cleanup compile switches used for Go-lite
	Fix:COLOURDISPLAY compiler switch has been added to the functions which are 
	used only for the normal color build.

	Aug 16, 2004    REF: CRR 24323   Deepa M.D
	Bug:Clenup of sprintf used for tracing
	Fix:Replace the char buf[]; sprintf (buf, "...", ...); TRACE_EVENT (buf); statements by TRACE_EVENT_PX


	Sep 01, 2004    REF: CRR 21380  Deepa M.D 
	Bug:Not getting proper display, When Messages Memory is Full.
	Fix:Assigning TextId and TextString will not display both the messages.
	Hence we need to use TextId and TextString2 or TextId2 and TextString

	Jun 04,2004 CRR:13601 xpradipg - SASKEN
	Description: CFO interrogation display : Timer to long
	Fix: Timer is enabled for the information dialog. It times out after 5 seconds from the last key
	press.
	25/10/00			Original Condat(UK) BMI version.	
	   
 $End

*******************************************************************************/


/*******************************************************************************
                                                                              
                                Include Files
                                                                              
*******************************************************************************/
#define ENTITY_MFW

/* includes */
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#if defined (NEW_FRAME)

#include "typedefs.h"
#include "vsi.h"
#include "pei.h"
#include "custom.h"
#include "gsm.h"

#else

#include "STDDEFS.H"
#include "custom.h"
#include "gsm.h"
#include "vsi.h"

#endif


#include "mfw_mfw.h"
#include "mfw_win.h"
#include "mfw_kbd.h"
/* SPR#1428 - SH - New Editor changes */
#ifndef NEW_EDITOR
#include "mfw_edt.h"
#endif
#include "mfw_tim.h"
#include "mfw_phb.h"
#include "mfw_sms.h"
#include "mfw_icn.h"
#include "mfw_mnu.h"
#include "mfw_lng.h"
#include "mfw_sat.h"
#include "mfw_kbd.h"
#include "mfw_nm.h"

#include "dspl.h"

#include "ksd.h"
#include "psa.h"

#include "MmiMain.h"
#include "MmiDummy.h"
//JVJE #include "MmiMsgsEdit.h"
//#include "MmiLists.h"
#include "MmiMmi.h"

#include "MmiDialogs.h"
#include "MmiLists.h"
#include "MmiMenu.h"
#include "MmiSoftKeys.h"

/* JF Modified
*/
#include "MmiBookController.h"
#include "cus_aci.h"

#include "prim.h"
#ifndef PCM_2_FFS
#include "pcm.h"
#endif


#include "mmiColours.h"

void dlg_initDisplayData_type( T_DISPLAY_DATA *displayInfo, U32 displayCol, int dlgType, T_BITMAP* dlgBitmap , int dlgSKFormat );

/*
 * START NEW PART
 */

static T_MFW_HND   dialog_info_create    (T_MFW_HND  parent_win);
static void        dialog_info           (T_MFW_HND  win,
                                          USHORT event, SHORT value, void * parameter);

static int         dialog_info_win_cb    (T_MFW_EVENT event, T_MFW_WIN * win);
static int 	dialog_info_win_resize_cb (T_MFW_EVENT event, T_MFW_WIN * win);

static T_MFW_CB    dialog_info_tim_cb    (T_MFW_EVENT event, T_MFW_TIM * tc);
static int         dialog_info_kbd_cb    (T_MFW_EVENT event, T_MFW_KBD * keyboard);
static int         dialog_info_kbd_long_cb (T_MFW_EVENT event, T_MFW_KBD * keyboard);
void mmi_dialogs_insert_animation_CB (T_MFW_EVENT event, T_MFW_TIM *tc);
void mmi_dialogs_animation_new_CB (T_MFW_EVENT event, T_MFW_TIM *tc);


MfwRect calcLayout( int dlgType, int dataSx, int dataSy, int bmpSx, int bmpSy)
{
	MfwRect area;
	int px,py;
	int sx,sy;

	TRACE_EVENT_P5("dlgType,= %d, dataSx = %d, dataSy = %d, bmpSx = %d, bmpSy = %d", dlgType, dataSx, dataSy, bmpSx, bmpSy);

	/*Adjust area available for drawing by the border */
	switch (dlgType & DLG_BORDER_VERTICAL)
	{
		case DLG_BORDER_VERTICAL_0:	sx =bmpSx;			break;
		case DLG_BORDER_VERTICAL_1:	sx =bmpSx*6/8;		break;
		case DLG_BORDER_VERTICAL_2:	sx =bmpSx*4/8;		break;
		case DLG_BORDER_VERTICAL_3:	sx =bmpSx*3/8;		break;
	}
	if (sx < dataSx)
		sx = dataSx;
	px = 0;

	switch (dlgType & DLG_BORDER_HORIZONTAL)
	{
		case DLG_BORDER_HORIZONTAL_0:	sy =bmpSy;			break;
		case DLG_BORDER_HORIZONTAL_1:	sy =bmpSy*6/8;		break;
		case DLG_BORDER_HORIZONTAL_2:	sy =bmpSy*4/8;		break;
		case DLG_BORDER_HORIZONTAL_3:	sy =bmpSy*3/8;		break;
	}
	if (sy < dataSy)
		sy = dataSy;
	py = 0;

	switch (dlgType & (DLG_INFO_LAYOUT_LEFT	| DLG_INFO_LAYOUT_RIGHT))
	{
		case DLG_INFO_LAYOUT_CENTRE:	//display info in centre of display
			px = px + (sx-dataSx)/2;
			sx = dataSx;
			break;
		case DLG_INFO_LAYOUT_RIGHT:	//all info is displayed at the foot of trhe display
			px = px+(sx-dataSx);
			sx = dataSx;
			break;
		case DLG_INFO_LAYOUT_LEFT:		//display all info at the top of the bitmap
			sx = dataSx;
			break;
		default:						//display info over entire area					
			break;
	}
	
	switch (dlgType & (DLG_INFO_LAYOUT_BOTTOM	| DLG_INFO_LAYOUT_TOP))
	{
		case DLG_INFO_LAYOUT_CENTRE:							//display info in centre of display
			py = py + (sy-dataSy)/2;
			sy = dataSy;
			break;
		case DLG_INFO_LAYOUT_BOTTOM:	//all info is displayed at the foot of trhe display
			py = py+(sy-dataSy);
			sy = dataSy;
			break;
		case DLG_INFO_LAYOUT_TOP:		//display all info at the top of the bitmap
			sy = dataSy;
			break;
		default:						//display info over entire area					
			break;
	}
	area.px = px;	area.py = py;
	area.sx = sx;	area.sy = sy;	//Area sx/sy must be no smaller than dataSx/Sy
	return (area);
}


/*******************************************************************************

 $Function:    	info_dialog

 $Description:	Common information dialog
 
 $Returns:		Dialogue info win

 $Arguments:	parent win, display info
 
*******************************************************************************/
T_MFW_HND info_dialog (T_MFW_HND        parent_win,
                       T_DISPLAY_DATA * display_info)
{
  T_MFW_HND win;				
  display_info->SoftKeyStrings = FALSE;
  
  win = dialog_info_create (parent_win);  			

  if (win NEQ NULL)
  {
    SEND_EVENT (win, DIALOG_INIT, 0, display_info);
  }
  return win;
}


/*******************************************************************************

 $Function:    	info_dialog_softkeystrings

 $Description:	Common information dialog, sets "softkeystrings" to TRUE
 
 $Returns:		Dialogue info win

 $Arguments:	parent win, display info, leftsoftkey, rightsoftkey
 
*******************************************************************************/
T_MFW_HND info_dialog_softkeystrings (T_MFW_HND parent_win, T_DISPLAY_DATA * display_info)
{
  T_MFW_HND win;

  display_info->SoftKeyStrings = TRUE;
  win = dialog_info_create (parent_win);

  if (win NEQ NULL)
  {
    SEND_EVENT (win, DIALOG_INIT, 0, display_info);
  }
  return win;
}


/*******************************************************************************

 $Function:    	dialog_info_create

 $Description:	Creation of an information dialog
 
 $Returns:		Dialogue info win

 $Arguments:	parent win
 
*******************************************************************************/
static T_MFW_HND dialog_info_create (T_MFW_HND parent_win)
{
  T_MFW_WIN     * win_data;
  T_dialog_info *  data = (T_dialog_info *)ALLOC_MEMORY (sizeof (T_dialog_info));
  TRACE_FUNCTION ("dialog_info_create()");

  data->info_win = win_create (parent_win, 0, E_WIN_VISIBLE, (T_MFW_CB)dialog_info_win_resize_cb);

  if (data->info_win EQ 0)
    return 0;

  /*
   * Create window handler
   */
  data->mmi_control.dialog   = (T_DIALOG_FUNC)dialog_info;
  data->mmi_control.data     = data;
  data->parent_win           = parent_win;
  win_data                   = ((T_MFW_HDR *)data->info_win)->data;
  win_data->user             = (void *)data;

  /*
   * return window handle
   */
  return data->info_win;
}


/*******************************************************************************

 $Function:    	dialog_info_destroy

 $Description:	Destruction of an information dialog
 
 $Returns:		void

 $Arguments:	win
 
*******************************************************************************/
void dialog_info_destroy (T_MFW_HND own_window)
{
  T_MFW_WIN     * win  = ((T_MFW_HDR *)own_window)->data;
  T_dialog_info * data = (T_dialog_info *)win->user;

  TRACE_FUNCTION ("dialog_info_destroy()");

  if (own_window == NULL)
  {
	TRACE_EVENT ("Error :- Called with NULL Pointer");
	return;
  }
	
  if (data)
  {
    /*
     * Exit TIMER & KEYBOARD Handle
     */
    kbd_delete (data->info_kbd);
    tim_delete (data->info_tim);

    if(data->animation_timer != 0)
    {
    	timDelete(data->animation_timer);

    	if (data->icon != 0)
    		icnDelete(data->icon);
    }

    /*
     * Delete WIN Handler
     */
    win_delete (data->info_win);
    /*
     * Free Memory
     */
    FREE_MEMORY ((void *)data, sizeof (T_dialog_info));
  }
}

void dlg_zeroDisplayData( T_DISPLAY_DATA *displayInfo)
{

	TRACE_EVENT("dlg_zeroDisplayData()");
	if (displayInfo == NULL)
		return;
	memset (displayInfo, 0x00, sizeof(T_DISPLAY_DATA));
	
	displayInfo->LeftSoftKey 	= 0;
	displayInfo->RightSoftKey 	= 0;
	displayInfo->LSKString 		= NULL;
	displayInfo->RSKString 		= NULL;
	displayInfo->TextString 	= NULL;
	displayInfo->TextString2 	= NULL;
	
    	displayInfo->WrapStrings 	= 0;
	
    	displayInfo->TextId       	= 0;
    	displayInfo->TextId2      	= 0;
    
	displayInfo->SoftKeyStrings	= FALSE;
	
    	displayInfo->Identifier   	= 0;
	displayInfo->anim_time		= 0;
	displayInfo->number_of_frames	= 0;
	displayInfo->current_frame		= 0;
//x0035544 Feb 07, 2006 DR:OMAPS00061467
#ifdef FF_MMI_SAT_ICON
       displayInfo->IconData.width 	= 0;
       displayInfo->IconData.height	= 0;
	displayInfo->IconData.dst 		= NULL;
	displayInfo->IconData.selfExplanatory 	= FALSE;
#endif	
	dlg_initDisplayData_events( displayInfo, NULL, 0, 0);
    
 	/* GW#2294 COLOUR_STATUS has been used for all popups - change this to default instead of COLOUR_POPUP .*/
 	dlg_initDisplayData_type( displayInfo, COLOUR_STATUS, 0, NULL, 0 );

	/* GW #2294 02/07/03 - The default bitmap is set-up here to allow us to disable it for some dialogs (if required) */
	displayInfo->bgdBitmap = icon_getBgdBitmap(BGD_CLOUD);
    
}

void dlg_initDisplayData_TextId( T_DISPLAY_DATA *displayInfo, int lsk, int rsk, int str1, int str2, int colId)
{
	if (displayInfo == NULL)
		return;
	dlg_zeroDisplayData(displayInfo);
	displayInfo->LeftSoftKey	= (USHORT)lsk;
	displayInfo->RightSoftKey	= (USHORT)rsk;
	displayInfo->TextId 		= str1;
	displayInfo->TextId2 		= str2;
	displayInfo->displayCol 	= colId ;
	
}

void dlg_initDisplayData_TextStr( T_DISPLAY_DATA *displayInfo, int lsk, int rsk,char *str1, char *str2, int colId)
{
	if (displayInfo == NULL)
		return;
	dlg_zeroDisplayData(displayInfo);
	displayInfo->LeftSoftKey 	= (USHORT)lsk;
	displayInfo->RightSoftKey 	= (USHORT)rsk;
	displayInfo->TextString 	= str1;
	displayInfo->TextString2 	= str2;
	displayInfo->displayCol 	= colId ;
}

void dlg_initDisplayData_events( T_DISPLAY_DATA *displayInfo, T_VOID_FUNC callback, int timer, T_MFW_EVENT keyEvents)
{
	displayInfo->Callback 		= callback;
	displayInfo->Time			= timer;
	displayInfo->KeyEvents		= keyEvents;
}

void dlg_initDisplayData_type( T_DISPLAY_DATA *displayInfo, U32 displayCol, int dlgType, T_BITMAP* dlgBitmap, int dlgSkFormat )
{
	displayInfo->displayCol	= displayCol;
	displayInfo->dlgType	= dlgType;
	displayInfo->bgdBitmap	= dlgBitmap;
}

/*******************************************************************************

 $Function:    	dialog_info

 $Description:	Dialog function for information dialog
 
 $Returns:		void

 $Arguments:	win, window handle event, value, parameter

*******************************************************************************/
void dialog_info (T_MFW_HND win, USHORT event, SHORT value, void * parameter)
{
  T_MFW_WIN      * win_data     = ((T_MFW_HDR *)win)->data;
  T_dialog_info  * data         = (T_dialog_info *)win_data->user;
  T_DISPLAY_DATA * display_info = (T_DISPLAY_DATA *)parameter;  
  TRACE_FUNCTION ("dialog_info()");

  switch (event)
  {
    case DIALOG_INIT:
      /*
       * Initialize dialog
       */
#if defined (WIN32)
      {
		  /***************************Go-lite Optimization changes Start***********************/
		  
		  //Aug 16, 2004    REF: CRR 24323   Deepa M.D
		  TRACE_EVENT_P1( "Identifier %d", display_info->Identifier);
		  /***************************Go-lite Optimization changes end***********************/

      }
#endif
      /*
       * Create timer and keyboard handler
       */
    data->info_tim             = tim_create (win, display_info->Time, (T_MFW_CB)dialog_info_tim_cb);
	data->info_kbd             = kbd_create (win, KEY_ALL, (T_MFW_CB)dialog_info_kbd_cb);
    data->info_kbd_long		   = kbd_create(win,KEY_ALL|KEY_LONG,(MfwCb)dialog_info_kbd_long_cb);

      /*
       * Store any other data
       */
      data->KeyEvents			 = display_info->KeyEvents;
	  data->TextString           = display_info->TextString;
      data->LeftSoftKey          = display_info->LeftSoftKey;
      data->RightSoftKey         = display_info->RightSoftKey;
      data->SoftKeyStrings		= display_info->SoftKeyStrings;	// SH - TRUE if using strings rather than IDs
      data->LSKString			= display_info->LSKString;		// Text for left soft key
      data->RSKString			= display_info->RSKString;		// Text for right soft key
      data->TextId               = display_info->TextId;
      data->Identifier           = display_info->Identifier;
      data->Callback             = display_info->Callback;
      data->TextString2          = display_info->TextString2;
      data->TextId2              = display_info->TextId2;
	  data->WrapStrings			= display_info->WrapStrings;	//GW-SPR#762

	  data->dlgCol				= display_info->displayCol;
	  data->dlgType				= display_info->dlgType;
	  data->dlgBgdBitmap		= display_info->bgdBitmap;
	  data->dlgSkFormat			= 0;
	  data->current_frame		= display_info->current_frame;
	  data->number_of_frames	= display_info->number_of_frames;
	  data->icon_array			= (MfwIcnAttr*)display_info->icon_array;
	  data->animation_timer		= 0;
//x0035544 Feb 07, 2006 DR:OMAPS00061467
#ifdef FF_MMI_SAT_ICON
     if(display_info->IconData.dst != NULL)
	{
         data->IconData.width		= display_info->IconData.width;
         data->IconData.height	= display_info->IconData.height;
         data->IconData.dst 	= display_info->IconData.dst;	
	  data->IconData.selfExplanatory 	= display_info->IconData.selfExplanatory;
	}
    else
 	{	
	  data->IconData.dst = NULL;
	  data->IconData.selfExplanatory = FALSE;
	  data->IconData.width =0;
	  data->IconData.height =0;
       }	  
#endif 

	  TRACE_EVENT_P1("anim_time = %d", display_info->anim_time);
	  TRACE_EVENT_P1("data->anim_time = %d", data->anim_time);
	  
	  if(display_info->anim_time != 0)
	  {
	  	data->animation_timer = timCreate(win,display_info->anim_time,(MfwCb)mmi_dialogs_animation_new_CB);
		timStart(data->animation_timer);
	  }

      if (display_info->Time NEQ FOREVER)
        tim_start (data->info_tim);
      win_show (win);
      break;
    case DIALOG_DESTROY:
		dialog_info_destroy(win);
	break;
  }
}

/*******************************************************************************

 $Function:    	dialog_info_win_cb

 $Description:	Callback function for information dialog
 
 $Returns:		void

 $Arguments:	window handle event, win
*******************************************************************************/
//GW-SPR#762-Added code to wraps txtString2 if there is room on the display to allow 
//very long numbers to be displayed.
#define MAX_LINE_CHAR MAX_LINE
static int dialog_info_win_cb (T_MFW_EVENT event, T_MFW_WIN * win)
{
    T_dialog_info * data = (T_dialog_info *)win->user;
	char buffer[MAX_LINE_CHAR+1];
	int yPos,bufPos,nLines;

    TRACE_FUNCTION ("dialog_info_win_cb()");


    if (data EQ 0)
	return 1;

    switch (event)
	{
	case E_WIN_VISIBLE:
	    if (win->flags & E_WIN_VISIBLE)
		{
		    /*
		     * Print the information dialog
		     */

		    /*
		     * Clear Screen
		     */
		    dspl_ClearAll();

		    /*
		     * Print softkeys
		     */
			icnShow(data->icon);
		    if (data->SoftKeyStrings)
		    	displayCustSoftKeys(data->LSKString, data->RSKString);	// SH - display text softkeys
		    else
				displaySoftKeys(data->LeftSoftKey, data->RightSoftKey);	// display ID softkeys
		    
		    /*
		     * Print information
		     */
		    /*MC SPR 1257, having to shift everything up 1 line as string wrapping for second
		    string causes softkey overwrite when in Chinese*/
		    if (data->TextId NEQ 0)
			{
			    ALIGNED_PROMPT(LEFT,0,DSPL_TXTATTR_CURRENT_MODE, data->TextId);
			}
		    else if (data->TextString NEQ NULL)
			{
#ifdef EASY_TEXT_ENABLED			
			    if (data->TextString[0] == 0x80) //MC if this is a unicode string
					displayAlignedText(LEFT, 0, DSPL_TXTATTR_UNICODE, &data->TextString[2]);
			    else
#endif
			    	displayAlignedText(LEFT, 0, DSPL_TXTATTR_NORMAL, data->TextString);
			}

		    if (data->TextId2 NEQ 0)
			{
			    ALIGNED_PROMPT(LEFT,Mmi_layout_first_line()/*MC*/,DSPL_TXTATTR_CURRENT_MODE, data->TextId2);
			}
		    else if (data->TextString2 NEQ NULL)
			{	
#ifdef EASY_TEXT_ENABLED	
				if (data->TextString2[0] == 0x80 ) //MC if this is a unicode string
					displayAlignedText(LEFT, Mmi_layout_first_line()/*MC*/, DSPL_TXTATTR_UNICODE, &data->TextString2[2]);
			    else
#endif
			{
				if ((data->WrapStrings & WRAP_STRING_2) && (strlen(data->TextString2) > MAX_LINE_CHAR))
				{	//Display text over a number of lines
					yPos = Mmi_layout_first_line();/*MC*/
					bufPos = 0;
					nLines = Mmi_number_of_lines_without_icons_on_top()-2;//starting on 2nd line
					while ((bufPos <strlen(data->TextString2)) && (nLines >=0))
					{
						memcpy(buffer,&data->TextString2[bufPos],MAX_LINE_CHAR);						
						bufPos = bufPos + MAX_LINE_CHAR;
						buffer[MAX_LINE_CHAR] = 0x00;
				    	displayAlignedText(LEFT, yPos, 0, buffer);
				    	yPos = yPos + Mmi_layout_line_height();
				    	nLines--;
					}
				}
				else
				{
			    	displayAlignedText(LEFT, Mmi_layout_second_line(),DSPL_TXTATTR_NORMAL, data->TextString2);
				}
			}
		}
	  }
	    break;

	default:
	    return 0;
	}
    return 1;
}
/*******************************************************************************

 $Function:    	dialog_info_win_cb

 $Description:	Callback function for information dialog
 
 $Returns:		void

 $Arguments:	window handle event, win

GW SPR#2294 02/07/03 -	Removed Unicode specific code as the 'display' routines called to calculate 
				the string length and output the text should correctly handle the 0x80 unicode tag 
				at the start.
				Modified the display code to wrap the text in the second text string.
				Modified the window drawing code so that if the text will not fit in the dialog box
				with the background bitmap, a pop-up 'box' will be drawn instead. If this will still 
				not be large enough, the entire screen is used.
				For the C-sample, there is no bitmap.
				Modified the code to use an array of values to position the text output.
GW SPR#2294 08/07/03 - Added code to expand the dialog box to include the animation (if any).
	
*******************************************************************************/
// Allow 4 lines of text (0..3) for dialogs
// Sep 06 2005  REF:  MMI-SPR-33548  x0012849
// To display a dialog properly when it contain lengthy message - No of lines increased.
#define MAX_DLG_LINES   (15)  
//Allow up to 40 chars of text on a dialog line
#define MAX_WRAP_CHAR  (42)
//Allow us to wrap text from line 2 to lines 2,3 and 4 lines
#define MAX_WRAP_LINES (MAX_DLG_LINES-1)

#define DLG_USE_BITMAP			0x0001		//use bitmap if present
#define DLG_USE_RECTANGLE		0x0002		//use a rectangle	
#define DLG_USE_FULL_SCREEN		0x0004		//use full-screen

#define DLG_LINE1 0
#define DLG_LINE2 1
static int dialog_info_win_resize_cb (T_MFW_EVENT event, T_MFW_WIN * win)
{
    T_dialog_info * data = (T_dialog_info *)win->user;
//     T_DISPLAY_DATA * display_info;   // RAVI
    int xPos[MAX_DLG_LINES];
    int yPos[MAX_DLG_LINES];
    // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
    //The  size of array  str and strlen are increased by 1, so that the last elements holds data 
    // which is used while wrapping the text.
    char* str[MAX_DLG_LINES+1];  
    int strLen[MAX_DLG_LINES+1]; 
	int i;
	char* lskStr,*rskStr;
	int wx = 0;  //,wy,sx=0,sy=0; // RAVI
	int wy = 0;   // RAVI
	int sx = 0;     // RAVI
	int sy = 0;     // RAVI
	int fullScreen = DLG_USE_RECTANGLE;
	int yOfs;
	int yBmpOfs = 0;
	MfwRect skArea;
	//x0035544 Feb 15, 2006. DR:OMAPS00061467
#ifdef FF_MMI_SAT_ICON
	USHORT		titleIconWidth = 0;	
#endif
    MfwRect area;
	int scrWidth = 0; //available width for the display // RAVI - Assignment to 0.
    // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
    // temp_ptr  is used  while wrapping the text.
    // Now str2[][] is not required.
    char *temp_ptr;     
	int nChar;

	t_font_bitmap bmp;
//	t_font_bitmap* bmpPtr = &bmp;  // RAVI - Not Referenced.
	
	int drawWinType;
	int nLines;

	int linePos=0;
	int lineLen = 0;
	int wrapLine = 1; /*GW #2294*/

	const int charWidth = dspl_GetTextExtent("0",1);
    TRACE_FUNCTION ("dialog_info_win_cb()");	 
//x0035544 Feb 15, 2006. DR:OMAPS00061467
#ifdef FF_MMI_SAT_ICON
       if (data->IconData.dst != NULL)
	{
		if (data->IconData.width > TITLE_ICON_WIDTH) 
		{
			titleIconWidth = TITLE_ICON_WIDTH;
		}
		else
		{
			titleIconWidth = data->IconData.width ;
		}
	}			
	else
	{
		titleIconWidth = 0;
	}
	
#endif   	
    if (data EQ 0)
	return 1;

    switch (event)
	{
	case E_WIN_VISIBLE:
	    if (win->flags & E_WIN_VISIBLE)
		{
		    /*
		     * Print the information dialog
		     */
		    for (i=0;i<MAX_DLG_LINES;i++)
		    {
		    	xPos[i]=0;
			    yPos[i] = Mmi_layout_line_height()*i;
			    str[i]=NULL;
			    strLen[i]=0;
		    }
                // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
                // Assign the values to last elments of the array str and strLen
                str[MAX_DLG_LINES] = NULL; 
                strLen[MAX_DLG_LINES] = 0;
			yOfs = Mmi_layout_line_height()/4;
			if (data->TextId != 0)
			    str[DLG_LINE1] = MmiRsrcGetText(  data->TextId);
		    else 
				str[DLG_LINE1] = data->TextString;
			
			if (data->TextId2 != 0)
			    str[DLG_LINE2] = MmiRsrcGetText(  data->TextId2);
				else
				str[DLG_LINE2] = data->TextString2;			

		    if (data->SoftKeyStrings!=0)
		    {
		     	lskStr = data->LSKString;
		     	rskStr = data->RSKString;
		    }
		    else
		    {
		    	if (data->LeftSoftKey != TxtNull)
					lskStr = MmiRsrcGetText(data->LeftSoftKey);
				else
					lskStr = NULL; 
				
		    	if (data->RightSoftKey != TxtNull)
					rskStr = MmiRsrcGetText(data->RightSoftKey);
				else
					rskStr = NULL; 	
		    }

		    if ((str[DLG_LINE1]!= NULL) || (str[DLG_LINE2]!=NULL))
		    {	//Draw a window for status info
		    	if (str[DLG_LINE2] == NULL)
		     	{
		     		sy = Mmi_layout_line_height()+yOfs*2; // 18 or 12
		     		
		     	}
		     	else
		     	{
		     		sy = Mmi_layout_line_height()*2+yOfs*3; // 33 or 22
		     	}
		     	
		     	//MC, if (Mmi_getCurrentLanguage() != CHINESE_LANGUAGE)	 
		     	{	//calculate longest string - use this to calc width of window
			     	sx = 0;
			     	if ((lskStr!=NULL) || (rskStr!=NULL))
			     	{
			     		sy = sy+Mmi_layout_softkeyHeight()+yOfs*2; 
			     		sx = sx + 10;
				     	if (lskStr != NULL) 
				     	{
	    					sx = sx + dspl_GetTextExtent(lskStr, 0);
				     	}
				     	if (rskStr != NULL) 
				     	{
	    					sx = sx + dspl_GetTextExtent(rskStr,0);
				     	}
				     	
			     	}
					for (i=DLG_LINE1;i<=DLG_LINE2;i++)
		     		{	
			     		strLen[i] = dspl_GetTextExtent(str[i],0);
		     		}
					
			     	/* Work out the desired width of the dialog. If we can wrap line 2 and it is long, wrap it */
			     	if (data->WrapStrings & WRAP_STRING_2)
			     		nLines = MAX_WRAP_LINES;
		     		else 
			     		nLines = 1;
#ifdef COLOURDISPLAY
					if (data->dlgBgdBitmap!=NULL)
					{
				     	//we only have room to split line 2 into 'max_lines_dlg_popup' lines in the pop-up.
				     	//NB this should be calculated depending on the height of the popup bitmap.
						const int max_lines_dlg_popup=2;
				     	if (nLines>max_lines_dlg_popup)
							nLines = max_lines_dlg_popup; 
						scrWidth = (data->dlgBgdBitmap->area.sx * 3)/4; //the max width is about 3/4 of the pop-up
						if ( (strLen[DLG_LINE2] > (scrWidth-charWidth)*nLines) || 
							(strLen[DLG_LINE1] > scrWidth))
						{
							//recalculate width below.
					     	if (data->WrapStrings & WRAP_STRING_2)
					     		nLines = MAX_WRAP_LINES;
							fullScreen = DLG_USE_RECTANGLE;	
		     		}
		     		else
						{
							fullScreen = DLG_USE_BITMAP;
							//Leave width as is
						}
					}
#else
					//On a C-sample, limit pop-up lines to 2 extra (any more - use entire screen)
					{
						const int max_lines_dlg_popup=2;
				    	if (nLines>max_lines_dlg_popup)
							nLines = max_lines_dlg_popup; 
					}

#endif
					if (fullScreen == DLG_USE_RECTANGLE) 
					{	
						//see if we can display as a pop-up
						if (SCREEN_SIZE_X < 128)
							scrWidth = SCREEN_SIZE_X-6;
						else
				  			scrWidth = (SCREEN_SIZE_X*7)/8;   	
						if ( strLen[DLG_LINE2] > (scrWidth-charWidth)*nLines)
						{
							//Cannot fit in as a pop-up - use full screen
							fullScreen = DLG_USE_FULL_SCREEN;
							scrWidth = SCREEN_SIZE_X;
						}
		     		else
		     		{
							//We can fit it in - but we may want to reduce the width for a nicer look.
						}
					}
					
				    /*
				     * Wrap second text line (e.g. for long phone numbers.)
				     */
                                  if (strLen[DLG_LINE2] > scrWidth-charWidth)
                                  {
                                      //If we can fit the string on 2 lines - do it.
                                      if (data->WrapStrings & WRAP_STRING_2)
                                      {
                                          if (str[DLG_LINE2][0] != 0x80) //not unicode
                                          {
                                               wrapLine = 0;
                                               lineLen = strlen(str[DLG_LINE2]);
                                              // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
                                              // memset is not required any more .
                                              //Now the last element of the str[] will point to the second string of the dialog
                                             str[MAX_DLG_LINES] = str[DLG_LINE2];  // Now move the second  line of text to the last element of the arrya
                                             strLen[MAX_DLG_LINES] = strLen[DLG_LINE2];// put the right value for the length of the string
                                             str[DLG_LINE2] = NULL ;  // Assign NULL to the second element of the array.
                                             while ((wrapLine < MAX_WRAP_LINES) && (linePos<lineLen))								
                                             {
                                                 // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
                                                 // Instead of DLG_LINE2 use MAX_DLG_LINES 
                                                 nChar = dspl_GetNcharToFit (&str[MAX_DLG_LINES][linePos], (USHORT)scrWidth);  
                                                 if (nChar > MAX_WRAP_CHAR)
                                                     nChar = MAX_WRAP_CHAR;
                                                 // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
                                                 // Allocate MAX_WRAP_CHAR no of bytes 
                                                 temp_ptr = (char*)mfwAlloc(MAX_WRAP_CHAR); 
                                                 if(NULL == temp_ptr)
                                                     return 0;									  	 
                                                 // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
                                                 // Now the destination of memcpy is temp_ptr instead of str2[wrapLine] and the source is str[MAX_DLG_LINES] instead of str[DLG_LINE2]
                                                 memcpy(temp_ptr,&str[MAX_DLG_LINES][linePos],nChar);  // Now the source data is from the last element of the array.
                                                 linePos = linePos+nChar;
                                                 ////GW - even if we cannot display the entire string - it is better than what we would have otherwise 
                                                 // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
                                                // Assign the value of pointer temp_ptr to str[]
                                                str[DLG_LINE2+wrapLine] = temp_ptr;
                                                temp_ptr = NULL; 
                                                strLen[DLG_LINE2 + wrapLine] = dspl_GetTextExtent(str[DLG_LINE2+wrapLine],0);
                                                wrapLine++;
                                             }
								
								}
		     			else
							{
								//Unicode is more problematic - we need the 0x80 at the front of the string
								//for the call to 'dspl_GetNcharToFit'. This will involve copying the entire remainder 
								//of 'str2' into a temporary buffer. At the moment, we only wrap numbers so this
								//code will wait until it is required.
							//	str[3] = "Code not written!!";	//issue warning
							//	strLen[3] = dspl_GetTextExtent(str[3],0);
						     	fullScreen = DLG_USE_FULL_SCREEN; //error - use full screen			
							}
						}
					}
					
					//Calculate longest line of text (including softkeys - sx already set to the softkey width)
					for (i=0;i< MAX_DLG_LINES;i++)
			     	{
			     		if (strLen[i]>sx) 
			     			sx = strLen[i];
					}
		     		if (sx > SCREEN_SIZE_X-charWidth)
		     			sx = SCREEN_SIZE_X;
		     		else
		     		{
		     			if (sx > SCREEN_SIZE_X/2)
			     			sx = sx + charWidth;
		     			else
			     			sx = sx + charWidth*2;
		     		}
		     		if (sy> sx) 
		     			sx = sy;
		     		wx = (SCREEN_SIZE_X-sx)/2;
		     		if (wx<0)
		     			wx=0;
		     	}

		     	if (sy > SCREEN_SIZE_Y)
		     		wy = 0;
		     	else if (SCREEN_SIZE_Y > 2*sy)  
		     		wy = (SCREEN_SIZE_Y*2/3-sy)/2; //display in middle of top 2/3 of screen
		     	else 
		     		wy = (SCREEN_SIZE_Y-sy)/2; //display in middle of screen
				if (wy < 10)
					wy = wy/2;
		     		
		     	if ((wx == 0) || (wy==0))
				{	//not enough room to display as a window - use whole screen
					fullScreen = DLG_USE_FULL_SCREEN;
		     }

#ifdef COLOURDISPLAY
					if ((data->icon_array != NULL) && (fullScreen != DLG_USE_BITMAP))
					{	//The dialog has an animation - we must make the pop-up large enough to support this  
						if (sx < data->icon_array[0].area.sx)
							sx = data->icon_array[0].area.sx;
						yBmpOfs = data->icon_array[0].area.py + data->icon_array[0].area.sy;
						wy = data->icon_array[0].area.py;
						sy = sy + data->icon_array[0].area.sy;
					}
#endif
		    }
			else
			{	
				//We have no strings to display - clear entire screen
				fullScreen = DLG_USE_FULL_SCREEN;
			}


		    /******************************
		     * Draw window (full screen/pop-up)
		     *****************************/
			if (fullScreen != DLG_USE_FULL_SCREEN)
				dspl_unfocusDisplay();
			area.px = 0;
			area.py = 0;
			area.sx = sx;
			area.sy = sy;
		    resources_setColour(data->dlgCol);
			drawWinType = DSPL_WIN_CENTRE;
			
		     if (fullScreen!=DLG_USE_FULL_SCREEN)
		     {
				t_font_bitmap bmp;
				t_font_bitmap* bmpPtr = NULL;

				for (i=0;i<MAX_DLG_LINES;i++)
				{
		     		//centre text
			     	xPos[i] = wx+(sx-strLen[i])/2;
			     	yPos[i] = wy+yOfs+yBmpOfs+Mmi_layout_line_height()*i;
				}
				
#ifdef COLOURDISPLAY
				if ((data->dlgBgdBitmap != NULL) && (fullScreen==DLG_USE_BITMAP))
				{
			     	bmp.format = data->dlgBgdBitmap->icnType;
			     	bmp.height = data->dlgBgdBitmap->area.sy;
			     	bmp.width = data->dlgBgdBitmap->area.sx;
			     	bmp.bitmap = data->dlgBgdBitmap->icons;
			     	bmpPtr = &bmp;
					area = calcLayout(data->dlgType, sx, sy, bmp.width, bmp.height);

					//Adjust size of available area depending on bitmap properties/dlgType.
					//dlgType== 0 =>display info in centre of bitmap
					if (data->dlgType == 0)
			     	{
			     		//If the bmp is bigger than the data we will move the bmp to
			     		//lie over the centre of the data
			     		area.px = area.px - (bmp.width - sx)/2;
			     		area.py = area.py - (bmp.height- sy)/2;
			     	}
					for (i=0;i<MAX_DLG_LINES;i++)
					{
						xPos[i] = xPos[i]  + area.px;
			     		yPos[i] = yPos[i]  + area.py;
					}

					TRACE_EVENT_P3("wy = %d, yOfs = %d, area.py = %d",wy,yOfs,area.py);					
					if( data->dlgBgdBitmap->icnType != ICON_TYPE_1BIT_UNPACKED )				
						dspl_SetBgdColour( COL_TRANSPARENT );
						
					
				}
				else
				{
					sy = sy + (wrapLine-2)*Mmi_layout_line_height();
					area.sy = sy;
				}
#else
				if (wrapLine>1)
				{
					sy = sy + (wrapLine-1)*Mmi_layout_line_height();
					area.sy = sy;
				}				
#endif
                    // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
                    //If  length of the dialog is bigger than screen then start the dialog from the top corner.
                   if(sy+wy >= SCREEN_SIZE_Y && sy < SCREEN_SIZE_Y)
                       if(wy>0 && wy < sy)
                       {                     
                            wy = (SCREEN_SIZE_Y - sy ) /2 ;// centre  the dialog
                            if(wy < 0)
                                wy=0;		
                            for (i=0;i<MAX_DLG_LINES;i++)		     		
                                yPos[i] = wy+yOfs+yBmpOfs+Mmi_layout_line_height()*i;
                       }           
		     	  dspl_DrawWin( wx,wy,sx,sy, drawWinType , bmpPtr);
		     }
		     else
		     {
			    dspl_ClearAll();		     
		    	sx = 84;
				for (i=0;i<MAX_DLG_LINES;i++)
		     	{
		     		xPos[i] = 0;
			     	yPos[i] = Mmi_layout_line(i+1);
		     }
		     }
		    /******************************
		     * Print softkeys
		     *****************************/
			icnShow(data->icon);
			if ((lskStr != NULL) || (rskStr != NULL))
			{
				if (fullScreen==DLG_USE_FULL_SCREEN)
					Mmi_layout_softkeyArea( &skArea );
				else
				{
					skArea.px = area.px+wx;
				    skArea.sx = area.sx;
				    skArea.py = area.py+wy+area.sy-Mmi_layout_softkeyHeight()-1;
				    skArea.sy = Mmi_layout_softkeyHeight();					
				}
				softKeys_displayStrXY(lskStr, rskStr, data->dlgSkFormat, data->dlgCol, &skArea);							
		     }

		    /******************************
		     * Print dialog text
		     *****************************/
			for (i=0;i<MAX_DLG_LINES;i++)
			{	 /* GW#2294 No need to draw zero length strings .*/					
			    if ((str[i] != NULL) && (strLen[i] > 0))
				    {				   
			   //x0035544 Feb 15, 2006. DR:OMAPS00061467    
			   #ifdef FF_MMI_SAT_ICON	
			              if(data->IconData.selfExplanatory == FALSE)			   	
			   		dspl_TextOut(xPos[i] + titleIconWidth, yPos[i], DSPL_TXTATTR_NORMAL, str[i] );
			   #else
			   		dspl_TextOut(xPos[i] , yPos[i], DSPL_TXTATTR_NORMAL, str[i] );
			   #endif		          				   	
			    	     }
			}
		  //x0035544 Feb 15, 2006. DR:OMAPS00061467	
		 #ifdef FF_MMI_SAT_ICON
		 if(data->IconData.dst != NULL)
		 {		 
		  if(str[DLG_LINE2] == NULL)
		 	{
		 	 if ((data->IconData.width > TITLE_ICON_WIDTH) || 
			 	(data->IconData.height > TITLE_ICON_HEIGHT))
		          {
			  	dspl_BitBlt2(xPos[0], yPos[0], 8, 
					    10, (void*)SATIconQuestionMark, 0, BMP_FORMAT_256_COLOUR);
		 	   }	

		      	 else		    
		       	dspl_BitBlt2(xPos[0], yPos[0], data->IconData.width, 
			      		 data->IconData.height, (void*)data->IconData.dst, 0, BMP_FORMAT_256_COLOUR);
		 	}
		 else
		 	{
		 	if ((data->IconData.width > TITLE_ICON_WIDTH) || 
			 	(data->IconData.height > TITLE_ICON_HEIGHT))
		          {
		       dspl_BitBlt2(xPos[DLG_LINE2], yPos[DLG_LINE2], 8, 
					    10, (void*)SATIconQuestionMark, 0, BMP_FORMAT_256_COLOUR);
		 	    }
			else
				dspl_BitBlt2(xPos[DLG_LINE2], yPos[DLG_LINE2],data->IconData.width, 
			      		 data->IconData.height, (void*)data->IconData.dst, 0, BMP_FORMAT_256_COLOUR);
		 	}
				
		 }		               
		 #endif

			
		     resources_restoreColour();	
		}
	    break;

	default:
	    return 0;
	} 
     // Sep 06 2005  REF:  MMI-SPR-33548  x0012849
     // Now free the allocated memory	 
    if (strLen[MAX_DLG_LINES] > scrWidth-charWidth)					
        if (data->WrapStrings & WRAP_STRING_2)					
            if (str[MAX_DLG_LINES][0] != 0x80) 
            {
                 for(i=DLG_LINE2;i<MAX_DLG_LINES;i++)
                 {
                      if(NULL != str[i] && strLen[i] > 0)			 	
   	                   mfwFree((U8*)str[i],MAX_WRAP_CHAR);
      	           }
	           str[MAX_DLG_LINES]=NULL;		  
	      }

    return 1;
}


/*******************************************************************************

 $Function:    	dialog_info_tim_cb

 $Description:	Callback function for the dialog info timer.

 
 $Returns:		MFW event handler

 $Arguments:	window handle event, timer control block

*******************************************************************************/
static T_MFW_CB dialog_info_tim_cb (T_MFW_EVENT event, T_MFW_TIM *tc)
{
  T_MFW_HND       win  = mfw_parent (mfw_header());
  T_MFW_WIN     * win_data = ((T_MFW_HDR *)win)->data;
  T_dialog_info * data = (T_dialog_info *)win_data->user;

  T_MFW_HND       parent_win = data->parent_win;
  USHORT          Identifier = data->Identifier;
  void (* Callback)() = data->Callback;

#if defined (WIN32)
      {
		  /***************************Go-lite Optimization changes Start***********************/

        //Aug 16, 2004    REF: CRR 24323   Deepa M.D
        TRACE_EVENT_P1 ("Identifier %d", data->Identifier););
		/***************************Go-lite Optimization changes end***********************/

      }
#endif

  /*
  ** SPR#1744 NDH
  ** Move the dialog destory in front of the Callback to make the processing consistent
  ** with the Right Keypress and Hangup Processing. Also to ensure that the dialog is 
  ** removed when the screen is redrawn.
  */
  dialog_info_destroy (win);

  if (Callback)
     (Callback) (parent_win, Identifier, INFO_TIMEOUT);

  return 0;
}


/*******************************************************************************

 $Function:    	dialog_info_kbd_cb

 $Description:	Keyboard event handler

 $Returns:		status int

 $Arguments:	window handle event, keyboard control block

*******************************************************************************/

static int dialog_info_kbd_cb (T_MFW_EVENT event, T_MFW_KBD *keyboard)
{
  T_MFW_HND       win  = mfw_parent (mfw_header());
  T_MFW_WIN     * win_data = ((T_MFW_HDR *)win)->data;
  T_dialog_info * data = (T_dialog_info *)win_data->user;
  T_MFW_HND       parent_win = data->parent_win;
  USHORT          Identifier = data->Identifier;
  void (* Callback)() = data->Callback;

  TRACE_FUNCTION("dialog_info_kbd_cb");

  switch (keyboard->code)
  {
    case KCD_LEFT:
		if (data->KeyEvents & KEY_LEFT )		
		{
			dialog_info_destroy (win);
			if (Callback)
			(Callback) (parent_win, Identifier, INFO_KCD_LEFT);
		}
       break;

    case KCD_RIGHT:
		if (data->KeyEvents & KEY_RIGHT)		
		{
			dialog_info_destroy (win);
	       if (Callback)
		     (Callback) (parent_win, Identifier, INFO_KCD_RIGHT);
		}
       break;

    case KCD_HUP:
		if (data->KeyEvents & KEY_HUP  || data->KeyEvents & INFO_KCD_ALL)
		{
	       dialog_info_destroy (win);
		   if (Callback)
			 (Callback) (parent_win, Identifier, INFO_KCD_HUP);
		}
       break;
    case KCD_MNUUP:
    	
		if (data->KeyEvents & KEY_MNUUP)
		{
		   if (Callback)
			 (Callback) (parent_win, Identifier, INFO_KCD_UP);
		}
		
       break;
    case KCD_MNUDOWN:
    	
		if (data->KeyEvents & KEY_MNUDOWN)
		{
		  if (Callback)
			 (Callback) (parent_win, Identifier, INFO_KCD_DOWN);
		}
		
       break;
       //MZ 7/3/01 used to start a call.
    case KCD_CALL:
    	if (data->KeyEvents & KEY_CALL ) 		
   		{
	       dialog_info_destroy (win);
		   if (Callback)
			 (Callback) (parent_win, Identifier, INFO_KCD_OFFHOOK);
    		}
		   break;
    default:
		if (data->KeyEvents & INFO_KCD_ALL)
		{
		/*
		Note: The variable Identifier is overwritten with the
		keycode of the dialog;
		we need it only for the Multicall Control !!
		*/
		   Identifier = keyboard->code;
	       dialog_info_destroy (win);
	       if (Callback)
	         (Callback) (parent_win, Identifier, INFO_KCD_ALL);
	    }
       break;

  }
  return MFW_EVENT_CONSUMED;
}

static int dialog_info_kbd_long_cb(T_MFW_EVENT event, T_MFW_KBD *keyboard){
	return MFW_EVENT_CONSUMED;
}



/*******************************************************************************

 $Function:    	mmi_dialog_information_screen

 $Description:	

 $Returns:		

 $Arguments:	

*******************************************************************************/

T_MFW_HND mmi_dialog_information_screen(T_MFW_HND parent_win, int TxtId, char* text, T_VOID_FUNC call_back, USHORT identifier)
{
	T_DISPLAY_DATA display_info;
	dlg_initDisplayData_TextId( &display_info, TxtNull,  TxtNull, TxtId, TxtNull, COLOUR_STATUS);
	dlg_initDisplayData_events( &display_info, call_back, THREE_SECS, KEY_ALL );
	//Sep 01, 2004    REF: CRR 21380  Deepa M.D 
	//Assigning TextId and TextString will not display both the messages.
	//Hence we need to use TextId and TextString2 or TextId2 and TextString
	display_info.TextString2   = text; 
	display_info.Identifier   = identifier;
	return info_dialog(parent_win,&display_info); //information screen
		
}

T_MFW_HND mmi_dialog_information_screen_forever(MfwHnd win,int TextId, char* TextStr, int colour)
{
	T_DISPLAY_DATA DisplayInfo;
	dlg_initDisplayData_TextId( &DisplayInfo, TxtNull, TxtNull, TextId,  TxtNull, colour);
	dlg_initDisplayData_events( &DisplayInfo, NULL, FOREVER, KEY_HUP );
	DisplayInfo.TextString 	= TextStr;
   return info_dialog(win, &DisplayInfo);
}

/*******************************************************************************

 $Function:    	mmi_dialogs_insert_icon

 $Description:	Displays one icon in a dialog 

 $Returns:		none

 $Arguments:	win, pointer to an icon

*******************************************************************************/
void mmi_dialogs_insert_icon (T_MFW_HND win_dialog ,MfwIcnAttr *icon)
{
  T_MFW_WIN      * win_data     = ((T_MFW_HDR *)win_dialog)->data;
  T_dialog_info  * data         = (T_dialog_info *)win_data->user;


		data->icon = icnCreate(win_dialog,icon,E_ICN_VISIBLE,NULL);			
		icnUnhide(data->icon);
		winShow(win_dialog);
		
}

/*******************************************************************************

 $Function:    	mmi_dialogs_insert_animation

 $Description:	starts an animation in a dialog

 $Returns:		none

 $Arguments:	win, animation time, pointer to an icon, number of frames

*******************************************************************************/
void mmi_dialogs_insert_animation (T_MFW_HND win_dialog , S32 anim_time ,MfwIcnAttr *icon ,UBYTE number_of_frames)
{
  T_MFW_WIN      * win_data     = ((T_MFW_HDR *)win_dialog)->data;
  T_dialog_info  * data         = (T_dialog_info *)win_data->user;


		data->number_of_frames = number_of_frames;
		data->current_frame = 0;
		data->icon_array = icon;  
		data->current_icon = data->icon_array;
		data->icon = icnCreate(win_dialog,data->current_icon,E_ICN_VISIBLE,NULL);			
		icnUnhide(data->icon);

    	data->animation_timer = timCreate(win_dialog,anim_time,(MfwCb)mmi_dialogs_insert_animation_CB);
		timStart(data->animation_timer);
		winShow(win_dialog);
		
}

/*******************************************************************************

 $Function:    	mmi_dialogs_insert_animation_CB

 $Description:	destroys the current icon and starts the next icon

 $Returns:		none

 $Arguments:	timer event, timer control block

*******************************************************************************/
void mmi_dialogs_insert_animation_CB (T_MFW_EVENT event, T_MFW_TIM *tc)
{
  T_MFW_HND       win  = mfw_parent (mfw_header());
  T_MFW_WIN     * win_data = ((T_MFW_HDR *)win)->data;
  T_dialog_info * data = (T_dialog_info *)win_data->user;

  
		icnDelete(data->icon);
		if (data->current_frame < (data->number_of_frames-1))
		{
				data->current_frame++;
				data->current_icon++;				
		}
		else				    	
		{
				data->current_frame = 0;
				data->current_icon = data->icon_array;
		}
		data->icon = icnCreate(win,data->current_icon,E_ICN_VISIBLE,NULL);			
		icnUnhide(data->icon);
		timStart(data->animation_timer);
		winShow(win);
						
}
/***************************Go-lite Optimization changes Start***********************/

//Aug 25, 2004    REF: CRR 24904   Deepa M.D
//This function is used only for the Color build.Hence it is put under the 
//COLOURDISPLAY compiler switch
#ifdef COLOURDISPLAY 
void mmi_dialogs_insert_animation_new (T_DISPLAY_DATA *animateInfo , S32 anim_time ,MfwIcnAttr* icon ,UBYTE number_of_frames)
{
	TRACE_EVENT("mmi_dialogs_insert_animation_new()");

		animateInfo->number_of_frames = number_of_frames;
		animateInfo->current_frame = 0;
		animateInfo->icon_array = icon;
		animateInfo->anim_time = anim_time;
		
}
#endif
/***************************Go-lite Optimization changes end***********************/

void mmi_dialogs_animation_new_CB (T_MFW_EVENT event, T_MFW_TIM *tc)
{
  T_MFW_HND	win = mfw_parent (mfw_header());
  T_MFW_WIN     * 	win_data = ((T_MFW_HDR *)win)->data;
  T_dialog_info *   data = (T_dialog_info *)win_data->user;
  char * idData;
  int px, py, sx, sy;
  MfwIcnAttr* icn_array;
  MfwIcnAttr* icn;

  TRACE_EVENT("mmi_dialogs_insert_animation_new_CB()");

    

  data->current_frame = (data->current_frame +1) % data->number_of_frames; 
  TRACE_EVENT_P1("data->current_frame = %d", data->current_frame);  
  TRACE_EVENT_P1("number_of_frames = %d", data->number_of_frames);
  
  icn_array = (MfwIcnAttr*)data->icon_array;
  TRACE_EVENT_P1("data->icon_array = %x", (int)data->icon_array);
  
  icn = &icn_array[data->current_frame];
 
  px = icn->area.px;
  py = icn->area.py;
  sx = icn->area.sx;
  sy = icn->area.sy;
  
  TRACE_EVENT_P4("px = %d, py = %d, sx = %d, sy = %d", icn->area.px,icn->area.py,icn->area.sx,icn->area.sy);
	
  idData = icn->icons;
	
  dspl_BitBlt2(px,py,sx,sy,(void*)idData,0,0x02);
  timStart(data->animation_timer);

}
//Jun 04,2004 CRR:13601 xpradipg - SASKEN
/*******************************************************************************

 $Function:    	InfoDialogTimRestart

 $Description:	restarts the information dialog timer

 $Returns:		none

 $Arguments:	window handler

*******************************************************************************/

void InfoDialogTimRestart(T_MFW_HND win)
{
	T_MFW_WIN * win_data;
        T_dialog_info * data;
	
        win_data = ((T_MFW_HDR *)win)->data;
        data     = (T_dialog_info *)win_data->user;

	tim_stop(data->info_tim);
	tim_start(data->info_tim);
}

// Feb 24, 2005 CRR:29102 xnkulkar - SASKEN
// As the user has already confirmed that all SMS messages are to be deleted, KEY_HUP is not
// registered.
/*******************************************************************************

 $Function:    	mmi_dialog_information_screen_delete_all

 $Description:	Displays the information screen during "Delete All" operation

 $Returns:	Handle of information dialog

 $Arguments:	window handle, text id, text string and generic status window

*******************************************************************************/
T_MFW_HND mmi_dialog_information_screen_delete_all(MfwHnd win,int TextId, char* TextStr, int colour)
{
	T_DISPLAY_DATA DisplayInfo;
	
	dlg_initDisplayData_TextId( &DisplayInfo, TxtNull, TxtNull, TextId,  TxtNull, colour);
	dlg_initDisplayData_events( &DisplayInfo, NULL, FOREVER, NULL ); 
	DisplayInfo.TextString 	= TextStr;
	
   	return info_dialog(win, &DisplayInfo);
}

