/******************************************************************************
 *
 * Copyright (c) 1999-2002 PalmSource, Inc. All rights reserved.
 *
 * File: Starter.cpp
 *
 * Release: Palm OS 5 SDK (68K) R2.
 *
 *****************************************************************************/

#include <PalmOS.h>
#include "StarterRsc.h"
#include "Find.h"

#include "HsExt.h"
#include <68K/Hs.h>
#include "string.h"

/*  DON'T DELETE
char *temp[] = { "ab", "cd", "de", "fg", "hi", "jk","lk","mn","op","qr","st","Find-gCdY"};
*/	

FileHand  f2Stream;
	
#define PRABA_ENABLED		2

//extern Boolean FindFormHandleEvent(EventPtr eventP);
void HandleNotification(SysNotifyParamType *pNotify);

static Err FindGSMOrCDMA();
static Char* GetDeviceType();
/***********************************************************************
 *
 *	Entry Points
 *
 ***********************************************************************/


/***********************************************************************
 *
 *	Internal Structures
 *
 ***********************************************************************/
typedef struct 
	{
	UInt8 replaceme;
	} StarterPreferenceType;

typedef struct 
	{
	UInt8 replaceme;
	} StarterAppInfoType;

typedef StarterAppInfoType* StarterAppInfoPtr;


/***********************************************************************
 *
 *	Global variables
 *
 ***********************************************************************/
//static Boolean HideSecretRecords;


/***********************************************************************
 *
 *	Internal Constants
 *
 ***********************************************************************/
#define appFileCreator			'gCdY'	// register your own at http://www.palmos.com/dev/creatorid/


#define appVersionNum			0x01
#define appPrefID				0x00
#define appPrefVersionNum		0x01

// Define the minimum OS version we support (2.0 for now).
#define kOurMinVersion	sysMakeROMVersion(2,0,0,sysROMStageRelease,0)
#define kPalmOS10Version	sysMakeROMVersion(1,0,0,sysROMStageRelease,0)


/***********************************************************************
 *
 *	Internal Functions
 *
 ***********************************************************************/


/***********************************************************************
 *
 * FUNCTION:    RomVersionCompatible
 *
 * DESCRIPTION: This routine checks that a ROM version is meet your
 *              minimum requirement.
 *
 * PARAMETERS:  requiredVersion - minimum rom version required
 *                                (see sysFtrNumROMVersion in SystemMgr.h 
 *                                for format)
 *              launchFlags     - flags that indicate if the application 
 *                                UI is initialized.
 *
 * RETURNED:    error code or zero if rom is compatible
 *
 * REVISION HISTORY:
 *
 *
 ***********************************************************************/
static Err RomVersionCompatible(UInt32 requiredVersion, UInt16 launchFlags)
{
	UInt32 romVersion;

	// See if we're on in minimum required version of the ROM or later.
	FtrGet(sysFtrCreator, sysFtrNumROMVersion, &romVersion);
	if (romVersion < requiredVersion)
		{
		if ((launchFlags & (sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp)) ==
			(sysAppLaunchFlagNewGlobals | sysAppLaunchFlagUIApp))
			{
			FrmAlert (RomIncompatibleAlert);
		
			// Palm OS 1.0 will continuously relaunch this app unless we switch to 
			// another safe one.
			if (romVersion <= kPalmOS10Version)
				{
				AppLaunchWithCommand(sysFileCDefaultApp, sysAppLaunchCmdNormalLaunch, NULL);
				}
			}
		
		return sysErrRomIncompatible;
		}

	return errNone;
}



/***********************************************************************
 *
 * FUNCTION:    GetObjectPtr
 *
 * DESCRIPTION: This routine returns a pointer to an object in the current
 *              form.
 *
 * PARAMETERS:  formId - id of the form to display
 *
 * RETURNED:    void *
 *
 * REVISION HISTORY:
 *
 *
 ***********************************************************************/
static void * GetObjectPtr(UInt16 objectID)
{
	FormPtr frmP;

	frmP = FrmGetActiveForm();
	return FrmGetObjectPtr(frmP, FrmGetObjectIndex(frmP, objectID));
}


/***********************************************************************
 *
 * FUNCTION:    MainFormInit
 *
 * DESCRIPTION: This routine initializes the MainForm form.
 *
 * PARAMETERS:  frm - pointer to the MainForm form.
 *
 * RETURNED:    nothing
 *
 * REVISION HISTORY:
 *
 *
 ***********************************************************************/
static void MainFormInit(FormPtr /*frmP*/)
{
}





/***********************************************************************
 *
 * FUNCTION:    MainFormDoCommand
 *
 * DESCRIPTION: This routine performs the menu command specified.
 *
 * PARAMETERS:  command  - menu item id
 *
 * RETURNED:    nothing
 *
 * REVISION HISTORY:
 *
 *
 ***********************************************************************/
static Boolean MainFormDoCommand(UInt16 command)
{
	Boolean handled = false;
	FormPtr frmP;

	switch (command)
		{
		case MainOptionsAboutFind:
			MenuEraseStatus(0);					// Clear the menu status from the display.
			frmP = FrmInitForm (AboutForm);
			FrmDoDialog (frmP);					// Display the About Box.
			FrmDeleteForm (frmP);
			//SysReset();
			handled = true;
			break;

		}
	
	return handled;
}


/***********************************************************************
 *
 * FUNCTION:    MainFormHandleEvent
 *
 * DESCRIPTION: This routine is the event handler for the 
 *              "MainForm" of this application.
 *
 * PARAMETERS:  eventP  - a pointer to an EventType structure
 *
 * RETURNED:    true if the event has handle and should not be passed
 *              to a higher level handler.
 *
 * REVISION HISTORY:
 *
 *
 ***********************************************************************/
static Boolean MainFormHandleEvent(EventPtr eventP)
{
	Boolean handled = false;
	FormPtr frmP;
	LocalID dbID;
	UInt16	cardNo;

	switch (eventP->eType) 
		{
		case menuEvent:
			return MainFormDoCommand(eventP->data.menu.itemID);

		case frmOpenEvent:
			frmP = FrmGetActiveForm();
			MainFormInit( frmP);
			FrmDrawForm ( frmP);
			//FieldPtr fldP = (FieldPtr)FrmGetObjectPtr(frmP,FrmGetObjectIndex(frmP,MainTestField));
			//if(fldP)
				//FldGrabFocus(fldP);
			//InsPtEnable(false);
			HsNavObjectTakeFocus(FrmGetActiveForm(),MainFindButton);
			handled = true;
			break;
			
		case frmUpdateEvent:
			// To do any custom drawing here, first call FrmDrawForm(), then do your
			// drawing, and then set handled to true.
			break;
		
		case ctlSelectEvent:
		switch(eventP->data.ctlSelect.controlID)
		{
			case MainFindButton:
				
				  if(PwdExists())	
				  {
					PwdRemove();
					PwdSet (NULL, "hai");
				  }
				  else
				   PwdSet (NULL, "hai");
				   
					PrefSetPreference(prefRemoteSyncRequiresPassword, true);
					PrefSetPreference(prefLocalSyncRequiresPassword, true);
				//SndPlaySystemSound(sndAlarm);
				
				//FindGSMOrCDMA();
				/*  DON'T DELETE  
				LocalID dbID;
				UInt16 cardNo;
				char name[35];
				DmSearchStateType search;
				
				Err err = DmGetNextDatabaseByTypeCreator(true,&search,'appl','gCdY',true,&cardNo,&dbID);
				while(!err)
				{
					Err err = DmDatabaseInfo(cardNo, dbID, name, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,NULL);
					if(!err)
					{
						for(int i=0;i<=11;i++)
						{
							if(StrCompare(temp[i],name)==0)
							{
								FindGSMOrCDMA();
							}
						}		
					}
					
					err = DmGetNextDatabaseByTypeCreator(true,&search,'appl','gCdY',true,&cardNo,&dbID);
				}*/				
				break;
			case MainCreateAlarmButton:
				//UInt16 cardNo;
				//UInt32 dbID;
				Char* pMsg = "Please wait for 30 seconds...";
				WinDrawChars(pMsg,StrLen(pMsg),20,100);
				SysTaskDelay(150);
				WinEraseChars(pMsg,StrLen(pMsg),20,100);
				SysCurAppDatabase(&cardNo, &dbID);
				
				AlmSetAlarm(cardNo,dbID,PRABA_ENABLED,TimGetSeconds()+30,false);
				//
				/*LocalID dbID;
				DmSearchStateType search;
				
				DmGetNextDatabaseByTypeCreator(true,&search,'appl','secr',true,&cardNo,&dbID);
				AlmSetAlarm(cardNo, dbID,PRABA_ENABLED,90,true);*/
				//
				
				break;
		}
		
		/*case penDownEvent:
			if(eventP->screenX>20 || eventP->screenX<130)
			{
				//FormPtr formP = FrmInitForm(FindForm);
				//FrmDoDialog(formP);
				//FrmDeleteForm(formP);
				
				//FrmPopupForm(FindForm);
				FormPtr formP = FrmInitForm(FindForm);
				FrmDoDialog(formP);
				SysTaskDelay(20);
				FrmDeleteForm(formP);
				if(formP)
				FrmEraseForm(formP);
				//}	
			}
			break;*/
		/*case penUpEvent: 
			//if(eventP->screenX>20 || eventP->screenX<130)
			//{
				FrmCustomAlert(FindAlert,"penUp","","");
				
				UInt16 formID = FrmGetActiveFormID();
				if(formID==1200)
				{
					FormPtr frmPtr = FrmGetFormPtr(1200);
					FrmEraseForm(frmPtr); 
				}
			//}	
			//FrmReturnToForm(MainForm);
			break;
		case penMoveEvent:
			//if(eventP->screenX>20 || eventP->screenX<130)
			//{
				FrmCustomAlert(FindAlert,"penMove","","");
				
				formID = FrmGetActiveFormID();
				if(formID==1200)
				{
					FormPtr frmPtr = FrmGetFormPtr(1200);
					FrmEraseForm(frmPtr); 
				}
			//}	
			//FrmReturnToForm(MainForm);
			break;*/
				
		default:
			break;
		
		}
	
	return handled;
}


/***********************************************************************
 *
 * FUNCTION:    AppHandleEvent
 *
 * DESCRIPTION: This routine loads form resources and set the event
 *              handler for the form loaded.
 *
 * PARAMETERS:  event  - a pointer to an EventType structure
 *
 * RETURNED:    true if the event has handle and should not be passed
 *              to a higher level handler.
 *
 * REVISION HISTORY:
 *
 *
 ***********************************************************************/
static Boolean AppHandleEvent(EventPtr eventP)
{
	UInt16 formId;
	FormPtr frmP;

	if (eventP->eType == frmLoadEvent)
		{
		// Load the form resource.
		formId = eventP->data.frmLoad.formID;
		frmP = FrmInitForm(formId);
		FrmSetActiveForm(frmP);

		// Set the event handler for the form.  The handler of the currently
		// active form is called by FrmHandleEvent each time is receives an
		// event.
		switch (formId)
			{
			case MainForm:
				FrmSetEventHandler(frmP, MainFormHandleEvent);
				break;
			
			case FindForm:
				FrmSetEventHandler(frmP, FindFormHandleEvent);	
				break;
					
			default:
//				ErrFatalDisplay("Invalid Form Load Event");
				break;

			}
		return true;
		}
	
	return false;
}


/***********************************************************************
 *
 * FUNCTION:    AppEventLoop
 *
 * DESCRIPTION: This routine is the event loop for the application.  
 *
 * PARAMETERS:  nothing
 *
 * RETURNED:    nothing
 *
 * REVISION HISTORY:
 *
 *
 ***********************************************************************/
static void AppEventLoop(void)
{
	UInt16 error;
	EventType event;

	do {
		EvtGetEvent(&event, evtWaitForever);

		if (! SysHandleEvent(&event))
			if (! MenuHandleEvent(0, &event, &error))
				if (! AppHandleEvent(&event))
					FrmDispatchEvent(&event);

	} while (event.eType != appStopEvent);
}


/***********************************************************************
 *
 * FUNCTION:     AppStart
 *
 * DESCRIPTION:  Get the current application's preferences.
 *
 * PARAMETERS:   nothing
 *
 * RETURNED:     Err value 0 if nothing went wrong
 *
 * REVISION HISTORY:
 *
 *
 ***********************************************************************/
static Err AppStart(void)
{
	StarterPreferenceType prefs;
	UInt16 prefsSize;

	// Read the saved preferences / saved-state information.
	prefsSize = sizeof(StarterPreferenceType);
	if (PrefGetAppPreferences(appFileCreator, appPrefID, &prefs, &prefsSize, true) != 
		noPreferenceFound)
		{
		}
	
	return errNone;
}


/***********************************************************************
 *
 * FUNCTION:    AppStop
 *
 * DESCRIPTION: Save the current state of the application.
 *
 * PARAMETERS:  nothing
 *
 * RETURNED:    nothing
 *
 * REVISION HISTORY:
 *
 *
 ***********************************************************************/
static void AppStop(void)
{
	StarterPreferenceType prefs;

	// Write the saved preferences / saved-state information.  This data 
	// will saved during a HotSync backup.
	PrefSetAppPreferences (appFileCreator, appPrefID, appPrefVersionNum, 
		&prefs, sizeof (prefs), true);
		
	// Close all the open forms.
	FrmCloseAllForms ();
}


/***********************************************************************
 *
 * FUNCTION:    StarterPalmMain
 *
 * DESCRIPTION: This is the main entry point for the application.
 *
 * PARAMETERS:  cmd - word value specifying the launch code. 
 *              cmdPB - pointer to a structure that is associated with the launch code. 
 *              launchFlags -  word value providing extra information about the launch.
 *
 * RETURNED:    Result of launch
 *
 * REVISION HISTORY:
 *
 *
 ***********************************************************************/
static UInt32 StarterPalmMain(UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags)
{
	Err error;

	error = RomVersionCompatible (kOurMinVersion, launchFlags);
	if (error) return (error);

	switch (cmd)
		{
		case sysAppLaunchCmdNormalLaunch:
			error = AppStart();
			if (error) 
				return error;
				
			FrmGotoForm(MainForm);
			AppEventLoop();
			AppStop();
			break;
		
		case sysAppLaunchCmdAlarmTriggered:
			SndPlaySystemSound(sndAlarm);
			FrmCustomAlert(FindAlert,"Sample Reminder Alarm from 'Find' application.","","");
			break;	
			
		case sysAppLaunchCmdSystemReset:
			
			break;
		
		/*case sysAppLaunchCmdNotify:	
			HandleNotification((SysNotifyParamType*)cmdPBP);
			break;			
		case sysNotifyVirtualCharHandlingEvent:
			HandleVirtualNotification((SysNotifyVirtualCharHandlingType* )pNotify->notifyDetailsP);
			break;*/
		
		}
	
	return errNone;
}


/***********************************************************************
 *
 * FUNCTION:    PilotMain
 *
 * DESCRIPTION: This is the main entry point for the application.
 *
 * PARAMETERS:  cmd - word value specifying the launch code. 
 *              cmdPB - pointer to a structure that is associated with the launch code. 
 *              launchFlags -  word value providing extra information about the launch.
 * RETURNED:    Result of launch
 *
 * REVISION HISTORY:
 *
 *
 ***********************************************************************/
UInt32 PilotMain( UInt16 cmd, MemPtr cmdPBP, UInt16 launchFlags)
{
	return StarterPalmMain(cmd, cmdPBP, launchFlags);
}



static Err FindGSMOrCDMA()
{
	UInt32 value;
	UInt32 phoneType;
	Err error=0;
	
	IndexedColorType textColorIndex,backGroundColorIndex;
	Char* msg = "Please Wait...from Prabakar..";
	RGBColorType color;
	color.r = 255;  //0x00;
	color.g = 255; //0x00;	
	color.b = 255; //0x00;	
	
	textColorIndex = WinRGBToIndex(&color);
	WinSetTextColor(textColorIndex);
	color.r = 255;
	color.g = 0;
	color.b = 0;
	
	backGroundColorIndex = WinRGBToIndex(&color);
	WinSetBackColor(backGroundColorIndex);
	int x=0;
	while(x<3)
	{
		WinDrawChars(msg, StrLen(msg), 20, 100);
		SysTaskDelay(50);
		WinEraseChars(msg, StrLen(msg), 20, 100);
		SysTaskDelay(50);
		x++;
	};

	color.r = 255;
	color.g = 255;
	color.b = 255;
	backGroundColorIndex = WinRGBToIndex(&color);
	WinSetBackColor(backGroundColorIndex);
	WinDrawChars(msg, StrLen(msg), 20, 100);
	SysTaskDelay(30);
	WinEraseChars(msg, StrLen(msg), 20, 100);
	
	SysTaskDelay(100);
	
	
	if(!FtrGet(hsFtrCreator, hsFtrIDVersion, &value)) 
	{ 
       if (value < 0x3523040) 
          return phnErrNotSupported; 
    } 
    else 
       return phnErrNotSupported;

	Char* devType = GetDeviceType();
	
	error = HsAttrGet(hsAttrPhoneType,0,&phoneType);
	
	switch(phoneType)
	{
		case hsAttrPhoneTypeCDMA:
			FrmCustomAlert(FindAlert,"This is ",devType," CDMA based Device.");	
			break;
		case hsAttrPhoneTypeGSM:
			FrmCustomAlert(FindAlert,"This is ",devType," GSM based Device.");	
			break;
		default:
			FrmCustomAlert(FindAlert,"Not Able to Find the Device type.","","");	
			break;	
			
	}
	
	return error;
}


static Char* GetDeviceType()
{
	UInt32 deviceID=0;
	UInt32 companyID=0;
		
	FtrGet(sysFtrCreator,sysFtrNumOEMDeviceID,&deviceID);
	FtrGet(sysFtrCreator,sysFtrNumOEMCompanyID,&companyID);
	
	if(companyID=='hspr')
	{
		if(deviceID=='H201' || deviceID=='H101')	
			return "'Treo 600'"; 
		else if(deviceID=='H202' || deviceID=='H102')
			return "'Treo 650'";
		else 
			return "Other";	
	}
}


void HandleNotification(SysNotifyParamType *pNotify)
{

		if(pNotify->notifyType==sysNotifyLateWakeupEvent)
		{
			EventPtr eventP;
			EvtGetEvent(eventP,-1);
			if(eventP->eType == keyDownEvent) {
				if(eventP->data.keyDown.modifiers & commandKeyMask)
					//if(eventP->data.keyDown.chr == vchrHardPower)
					switch(eventP->data.keyDown.chr)
					{
						case vchrHard1:
						case vchrHard2:
						case vchrHard3:
						case vchrHard4:
						case vchrHardPower:
							FrmCustomAlert(FindAlert,"Sample Reminder Alarm from 'Find' application.","","");
							break;
					}		
			}
		}	

}


