Define Class RoaApp As Custom

	Dimension aVersiune[12]
	Dimension aforms[1]			&&		Forms collection for application object.
	Dimension aformnames[1]		&&		Form name collection for application object.

	lParametri = .F.
	cHost = Null
	cUserName = Null
	cPassword = Null
	nIdUtil = 0
	nIdProgram = 0
	nAn = 0
	nLuna = 0
	cSchema = Null
	nIdFirma = 0
	cLastSetTalk = Null
	cLastSetPath = Null
	cLastSetClassLib = Null
	cMainClassLib = Null

	cNumeProgram = Null
	cAppName = Null
	cAppPath = Null
	cUtilizatoriPath = Null
	cDirMare = Null

	cLocalePath = Null
	lTraducere = .F.
	oLocale = Null

	cGeneralIniFile = Null
	cSecurityFile = Null
	lnewcryptxml = .T.
	lnewcryptfll = .T.

	lQuit = .F.

	oLog = Null
	oExecutor = Null
	oConn = Null
	oMyXMLHTTP = Null
	oBaraFavorite = Null
	oBaraManual = Null
	oCalendar = Null
	oExport = Null

	lFontCharSet = .F.

	cStartUpForm = ""
	cStartUpMenu = ""	&&	Menu (MPR) which is executed when the application object is shown.
	Protected ccaption
	ccaption = ""		&&	Caption of the application object.
	Protected cicon
	cicon = ""			&&	Icon of the application object.
	Protected clasticon
	clasticon = ""		&&	Last icon setting of _screen before application object was intantiated.
	Protected clastcaption
	clastcaption = ""	&&	Last caption setting of _screen before application object was intantiated.
	nformcount = 0		&&	Forms collection count for application object.
	npixeloffset = 22	&&	Number of pixels which offset multiple instances of the same form.
	lcascadeforms = .T.	&&	Specifies whether forms are cascaded if multiple instances of the same form are opened in the same top and left positions of the desktop.
	lreadevents = .T.	&&	Enable READ EVENTS within ReadEvents method.
	Name = "roaapplication"
	cReportPreviewer = ""
	cReportPreviewerPath = ""
	

	Function initializeaza
		Lparameters tParametri,tcNumeProgram,tcMainClassLib
		Local llReturn
		llReturn = .F.
		This.ResetFormsCollection()
		This.cNumeProgram = tcNumeProgram
		This.cMainClassLib = tcMainClassLib
		If This.verificaProgram()
			If This.citesteParametri(tParametri)
				This.initializeazaFunctiiWin()
				This.initializeazaEnv()
				This.initializeazaCai()
				This.initializeazaClassLib()
				This.initializeazaProceduri()
				This.initializeazaSettingsIni()
				This.initializeazaSecurity()
				This.initializeazaReportPreviewer()
				This.initializeazaLocale()
				This.initializeazaVariabile()
				This.initializeazaVariabileGlobale()
				This.initializeazaObiecte()
				This.initializeazaObiecteGlobale()
				llReturn = .T.
			Endif
		Endif
		Return llReturn
	Endfunc

	Function verificaProgram
		Local llReturn
		llReturn = .T.
		If !Like(This.cNumeProgram + '*', Upper(Alltrim(Juststem(Sys(16,0))))) AND _VFP.StartMode <> 0 
			Messagebox("Nu puteti porni acest program!",0+16,"Atentie")
			llReturn = .F.
		Else
			_Screen.Icon=This.cNumeProgram + [.ICO]
		Endif
		Return llReturn
	Endfunc

	Procedure initializeazaFunctiiWin
		Declare Integer GetShortPathName In Win32API;
			STRING @lpszLongPath,	String @lpszShortPath,;
			INTEGER cchBuffer

		Declare Integer GetPrivateProfileString In Kernel32 ;
			string, String, String, String @, Integer, String

		Declare Integer WritePrivateProfileString In Kernel32 string, String, String, String

		Declare Integer CopyFile In kernel32 STRING  lpExistingFileName, STRING  lpNewFileName,	INTEGER bFailIfExists

		Declare Integer MoveFile In Win32API String @cSource, String @cTarget

		Declare Integer DeleteFile In kernel32 String @pFileName			

		Declare Integer URLDownloadToFile In urlmon.Dll;
			INTEGER pCaller, String szURL, String szFileName,;
			INTEGER dwReserved, Integer lpfnCB

		Declare Integer PathFileExists In shlwapi;
			STRING pszPath
	Endproc

	Function ShortPath
		Lparameter tcPath
		Local lcPath, lcShortName, lnLength, lnResult
		lcPath = tcPath
		lcShortName = Space(260)
		lnLength = Len(lcShortName)
		lnResult = GetShortPathName(@lcPath, @lcShortName, lnLength)
		If lnResult = 0
			Return ""
		Endif
		Return Left(lcShortName,lnResult)
	Endfunc

	Function GetAppStartPath
		Local lcPath
		Do Case
*** VFP 6 provides ServerName property for COM servers EXE/DLL/MTDLL
			Case Inlist(Application.StartMode,2,3,5)
				lcPath = Justpath(Application.ServerName)
*!*	   *** Interactive
*!*	   CASE (Application.StartMode) = 0
*!*	         lcPath = SYS(5) + CURDIR()
*** Active Document
			Case Atc(".APP",Sys(16,0)) > 0
				lcPath = Justpath(Sys(16,0))
*** Standalone EXE or VFP Development
			Otherwise
				lcPath = Justpath(Sys(16,0))
				If Atc("PROCEDURE",lcPath) > 0
					lcPath = Substr(lcPath,Rat(":",lcPath)-1)
				Endif
		Endcase
		Return Addbs(lcPath)
	Endfunc

	************************************************************************
	* wwAPI :: CopyFile
	*********************************
	***  Function: Copies File. Faster than Fox Copy and handles
	***            errors internally.
	***      Pass: tcSource -  Source File
	***            tcTarget -  Target File
	***            tnFlag   -  0* override, 1 don't
	***    Return: .T. or .F.
	************************************************************************
	Function CopyFile
		Lparameters lcSource, lcTarget, lnFlag
		Local lnRetVal

		*** Copy File and overwrite
		lnFlag = Iif(Type("nFlag") = "N", nFlag, 0)
		lnRetVal = CopyFile(m.lcSource, m.lcTarget, m.lnFlag)

		Return Iif(m.lnRetVal = 0, .F., .T.)
	Endproc

	************************************************************************
	* wwAPI :: MoveFile
	*********************************
	***  Function: Rename/Moves a file
	***      Pass: tcSource -  Source File
	***            tcTarget -  Target File
	***    Return: .T. or .F.
	************************************************************************
	Function MoveFile
		Lparameters lcSource, lcTarget
		Local lnRetVal

		lnRetVal = MoveFile(m.lcSource, m.lcTarget)

		Return Iif(m.lnRetVal = 0, .F., .T.)
	Endfunc

	************************************************************************
	* wwAPI :: MoveFile
	*********************************
	***  Function: Deletes a file
	***      Pass: tcFile -  File path
	***    Return: .T. or .F.
	************************************************************************
	Function DeleteFile
		Lparameters tcFile
		Local lnRetVal

		lnRetVal = DeleteFile(m.tcFile)

		Return Iif(m.lnRetVal = 0, .F., .T.)
	ENDFUNC
	
	*--------------------------------------------
	* Check file exist
	* Return .T. / .F.
	FUNCTION FileExist
		LPARAMETERS tcFileName
		LOCAL ARRAY laDirFiles[1,5]
		LOCAL llExist
	    llExist = .F.
	    IF !EMPTY(m.tcFileName)
	        IF ADIR(laDirFiles, m.tcFileName) > 0
	            llExist = .T.
	        ENDIF
	    ENDIF
	    RETURN m.llExist
	ENDFUNC && FileExist  
	
	*--------------------------------------------
	Function ShowErrorEx
		Lparameters toEx, tcMesaj
		* tcMesaj (optional): mesaj suplimentar
		Local loEx as Exception, lcMesaj 
		loEx = m.toEx
		lcMesaj = IIF(!EMPTY(m.tcMesaj), ALLTRIM(TRANSFORM(m.tcMesaj)) + CHR(13) + CHR(10), '')
		
		amessagebox(lcMesaj + ;
			  loEx.Message + Chr(13) + Chr(10) + ;
			  'Eroare #' + Alltrim(Str(loEx.ErrorNo)) + Chr(13) + Chr(10) + ;
			  'Linia #' +  Alltrim(Str(loEx.Lineno)) + Chr(13) + Chr(10) + ;
			  'Procedura ' + loEx.Procedure + Chr(13) + Chr(10) + ;
			  'Cod ' + loEx.LineContents + CHR(13) + CHR(10) + ;
			  GETCALLSTACK(), 0 + 16, _Screen.Caption)
	ENDFUNC
	
	************************************************************************
	Procedure Lista2Array
		Lparameters tcLista,taArray,tcSeparator
&& tcLista este un sir de caractere care contine elementele separate prin <;> default
&& tarray este vectorul care se completeaza - trebuie dat prin referinta
&& tcSeparator separatorul de elemente din tcLista - default este ";" - este optional
&& intoarce numarul de elemente gasite
&& ex: lnNr = lista2array("ana;are;mere",@alista,";")
		External Array taArray
		Local Lclista,lcSeparator,lnNRF,lcF1,i
		lnNRF = 0

		Lclista=Allt(tcLISTA)
		If Parameters()<3 Or Empty(tcSeparator)
			lcSeparator=";"
		Else
			lcSeparator=Alltrim(tcSeparator)
		Endif

		If Right(Lclista,1)!=lcSeparator
			Lclista=Lclista+lcSeparator
		Endif

		lnNRF=Occurs(lcSeparator,Lclista)

		If lnNRF>0
			Dimension taArray[lnNrf,1]

			For i=1 To lnNRF
				lcF1=Left(Lclista,At(lcSeparator,Lclista)-1)

				If i!=lnNRF
					Lclista=Substr(Lclista,At(lcSeparator,Lclista)+1)
				Endif

				taArray[i]=lcF1
			Endfor
		Else
			lnNRF = 0
		Endif

		Return lnNRF

	Endproc && lista2array

	Function citesteParametri
		Lparameters tParametri
		Local llReturn, lcParametri, lnNr
		Private paParametri
		Declare paParametri[1]
		llReturn = .T.
		If Type('tParametri') = 'C'
			This.lParametri = .T.
			lcParametri = Alltrim(tParametri)
			lnNr = This.lista2array(lcParametri,@paParametri,";")
			Do Case
				Case lnNr < 5
					aMessagebox('Numar incorect de parametri',0+16,'Eroare')
					llReturn = .F.
				Case Type('paParametri',1)<>"A"
					llReturn = .F.
				Otherwise
					This.cHost = paParametri[1]
					This.cUserName = paParametri[2]
					This.cPassword = paParametri[3]
					This.nIdUtil = Round(Val(paParametri[4]),0)
					This.nIdProgram = Round(Val(paParametri[5]),0)
					If Alen(paParametri,1)=10
						This.nAn = Val(paParametri[7])
						This.nLuna = Val(paParametri[8])
						This.cSchema = paParametri[9]
						This.nIdFirma = Val(paParametri[10])
					Endif
			Endcase
		Else
			This.lParametri = .F.
			This.cHost = ''
			This.cUserName = ''
			This.cPassword = ''
			This.nIdUtil = 0
			This.nIdProgram = 0
			This.nAn = 0
			This.nLuna = 0
			This.cSchema = ''
			This.nIdFirma = -1
		Endif
		Release paParametri, lcParametri, lnNr
		Return llReturn
	Endfunc

	Procedure initializeazaEnv
		This.cLastSetTalk = Set("TALK")
		This.clastcaption=_Screen.Caption
		This.clasticon=_Screen.Icon
		This.lFontCharSet = AFONT(laFontCharSet,"Arial Narrow",238)

		Push Menu _Msysmenu
		Set Century On
		Set Deleted On
		Set Date To Dmy
		Set Exclusive Off
		Set Cpdialog Off
		Set Talk Off
		Set Safety Off
		Set Escape Off
		Set Exact On
		Set Mark To '/'
		Set Ansi On
		Set Console Off
		Set Notify Off
		Set Seconds Off
		Set NullDisplay To ''
		Set Decimals To 4
		Set Point To '.'
		SET HOURS TO 24
		Set SQLBUFFERING On
		_Screen.Visible=.F.
		_Screen.AutoCenter=.T.

*		On Shutdown do onShutDown()
		On Error goApp.ErrorHandler(Error(),Program(),Lineno())
	Endproc

	Procedure restaureazaEnv
		On Error
		On Shutdown
		If Not Empty(This.clastcaption) And Not _Screen.Caption==This.clastcaption
			_Screen.Caption=This.clastcaption
		Endif
		If Not Empty(This.clasticon) And Not _Screen.Icon==This.clasticon
			_Screen.Icon=This.clasticon
		Endif
		If Not This.cLastSetClassLib==Set("classlib") AND !EMPTY(This.cMainClassLib)
			Release Classlib (This.cMainClassLib)
		Endif
		If Empty(NVL(This.cLastSetPath, ''))
			Set Path To
		Else
			Set Path To (This.cLastSetPath)
		Endif
		If This.cLastSetTalk=="ON"
			Set Talk On
		Else
			Set Talk Off
		Endif

		If Cntbar("_msysmenu")=7
			Return
		Endif
		Set Classlib To
		Set Path To
		* Clear All

		* Close All
		Pop Menu _Msysmenu
	Endproc

	Procedure initializeazaCai
		This.cLastSetPath=Set("PATH")
		This.cAppPath = Addbs(This.ShortPath(This.GetAppStartPath()))
		If Right(This.cAppPath ,9)="PROGRAME\"
			This.cAppPath = Substr(This.cAppPath ,1,Len(This.cAppPath )-9)
		Endif
		This.cAppName=Allt(Uppe(Juststem(Sys(16,0))))
		This.cUtilizatoriPath = This.cAppPath + "UTILIZATORI\"
		This.cDirMare = Addbs(Left(This.cAppPath,Rat("\",This.cAppPath,2)-1))

		Set Default To (This.cAppPath)
		lcPath = This.cAppPath + 'Date;' + ;
			This.cAppPath + 'Include;' + ;
			This.cAppPath + 'FERESTRE;' + ;
			This.cAppPath + 'GRAFICE;' + ;
			This.cAppPath + 'CLASE;' + ;
			This.cAppPath + 'MENIURI;' + ;
			This.cAppPath + 'PROGRAME;' + ;
			This.cAppPath + 'RAPOARTE;' + ;
			This.cAppPath + 'COMUN\CLASE;' + ;
			This.cAppPath + 'COMUN\FERESTRE;' + ;
			This.cAppPath + 'COMUN\PROGRAME;' + ;
			This.cAppPath + 'COMUN\GRAFICE;' + ;
			This.cAppPath + 'COMUN\RAPOARTE;' + ;
			This.cAppPath + 'COMUN\UTILE\CTL32;' + ;
			This.cAppPath + 'COMUN\UTILE\HPDF;' + ;
			This.cAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ;
			This.cAppPath + 'COMUN\UTILE\WEB;' + ;
			This.cAppPath + 'COMUN\UTILE\CALENDAR;' + ;			
			This.cAppPath + 'COMUN\UTILE\GridExtras;' + ;			
			This.cAppPath + 'COMUN\UTILE\nfjson;' + ;			
			This.cAppPath + 'COMUN\UTILE\tooltip;' + ;
			This.cAppPath + 'COMUN\UTILE\excel;' + ;
			This.cAppPath + 'COMUN\UTILE\Menu;' + ;						
			This.cAppPath + 'COMUN\UTILE\email;' + ;				
			This.cDirMare + 'COMUNROA\'

		Set Path To &lcPath Additive
		This.initializeazaAlteCai()
	Endproc

	Procedure initializeazaAlteCai
*!*	suprascrisa in fiecare aplicatie care are cai suplimentare
*!*	la sfarsit trebuie sa aiba SET PATH TO ... ADDITIVE
	Endproc

	Procedure initializeazaClassLib
		This.cLastSetClassLib=Set("CLASSLIB")
		If !Empty(Nvl(This.cMainClassLib,[]))
			Set Classlib To (This.cMainClassLib) Additive
		Endif
*!*	_
		Set Classlib To _calendar.vcx Additive
*!*	A
		Set Classlib To appwiz Additive
		Set Classlib To accessibility Additive		
*!*	B
		Set Classlib To baza Additive
*!*	C
		Set Classlib To CAUT Additive
		Set Classlib To caut_ora Additive
		Set Classlib To cauta_alfa_forms Additive
*!*	D
		Set Classlib To decabaza Additive
*!*	F
		Set Classlib To ferestre_cere_date Additive
		Set Classlib To ferestre_oracle Additive
*!*	L
		Set Classlib To locale Additive
*!*	M
		Set Classlib To Messagebox Additive
*!*	O
		Set Classlib To ofirma Additive
		*Set Classlib To onom_sal Additive
		Set Classlib To onomenclatoare Additive
		Set Classlib To ooptiuni Additive
		*Set Classlib To opersonal Additive
		Set Classlib To otoolbar Additive
		SET CLASSLIB TO ocriterii ADDITIVE 
*!*	R
		Set Classlib To registry Additive
*!*	V
		SET CLASSLIB TO vfpxworkbookxlsx ADDITIVE 
*!*	W
		Set Classlib To wwdialogs Additive


		This.initializeazaAlteClassLib()

		Set Library To (This.cDirMare+[COMUNROA\vfpencryption.fll]) Additive
	Endproc


	Procedure initializeazaAlteClassLib
*!*	suprascrisa in fiecare aplicatie care are clase suplimentare
	Endproc

	Procedure initializeazaProceduri
*!*	_
		Set Procedure To _libpdf Additive
*!*	A
		Set Procedure To acces_meniu Additive
		Set Procedure To acces_meniu2 Additive		
*!*	B
		Set Procedure To build_err_msgs Additive		
*!*	C
		Set Procedure To cauta_alfa Additive
*!*	F
		Set Procedure To filebringer Additive
		Set Procedure To frxoutput Additive		
*!*	G
		Set Procedure To gencursor Additive
*!*	I
		Set Procedure To ini Additive
		Set Procedure To iniacces Additive
		Set Procedure To init_program Additive
*!*	O
		Set Procedure To ocautare Additive
		Set Procedure To oExport Additive
		Set Procedure To oinit_optiuni Additive
		Set Procedure To onomenclatoare Additive
		Set Procedure To ooperatii_comune Additive
		Set Procedure To oproceduri_ams Additive
		Set Procedure To oproceduri_comune Additive
		Set Procedure To oproceduri_maintenance Additive
		Set Procedure To osecurity Additive
		Set Procedure To oupdate Additive
*!*	P
		Set Procedure To pdflistener Additive		
		Set Procedure To proceduri_comune Additive
		Set Procedure To proceduri_Excel Additive
		Set Procedure To procese.prg Additive
*!*	R		
		SET PROCEDURE TO regex.prg ADDITIVE 		
*!*	Q
		Set Procedure To quitapp Additive
		Set Procedure To updateserver Additive
*!*	V
		Set Procedure To validare Additive
		Set Procedure To Version Additive
*!*	W
		Set Procedure To This.cAppPath + "\COMUN\UTILE\web\WWAPI.PRG" Additive
		Set Procedure To wwconfig Additive
		Set Procedure To wwcodeupdate Additive
		Set Procedure To wwhttp Additive
		Set Procedure To This.cAppPath + "\COMUN\UTILE\web\WWUTILS.PRG" Additive
		Set Procedure To wwxmlhttp Additive
*!*	X
		Set Procedure To xmlaccess Additive
		Set Procedure To xmlparser Additive

		This.initializeazaAlteProceduri()
	Endproc

	Procedure initializeazaAlteProceduri
*!*	suprascrisa in fiecare aplicatie care are proceduri suplimentare
	Endproc

	Procedure initializeazaLocale
		Local lcObjLocale, lcLanguage, llLocale, lcLocale, lcLocalePath
		lcLocalePath = This.cAppPath + "Locale\"
		If Directory(lcLocalePath)
			This.cLocalePath = lcLocalePath
			This.lTraducere = .F.
		Endif
		lcLanguage = getini(This.cGeneralIniFile,"locale","lang")
		llLocale = getini(This.cGeneralIniFile,"locale","llocale")
		If Empty(lcLanguage) OR UPPER(m.lcLanguage) = 'ROMANA'
			lcLocale = 'Romana'
			lcObjLocale = [Locale_dummy]
		Else
			lcLocale = lcLanguage
			lcObjLocale = [Locale]
		Endif
		This.oLocale=Newobject(lcObjLocale,"Locale.vcx")
		If !Empty(llLocale) And llLocale<>'0'
			This.oLocale.llocale=.T.
		Endif
		This.oLocale.locale = lcLocale
		Release lcObjLocale, lcLanguage, llLocale, lcLocale, lcLocalePath
	Endproc

	Procedure initializeazaReportPreviewer
		This.cReportPreviewer = "FoxyPreview"
		This.cReportPreviewerPath = This.cDirMare + "COMUNROA\"
	Endproc

	Procedure initializeazaSettingsIni
		Local lcSettings
		This.cGeneralIniFile = This.cDirMare + "settings.ini"
		If !File(This.cGeneralIniFile)
			TEXT TO lcSettings NOSHOW
[errors]
host=http://83.103.197.79:3000/errors/create_xml
			ENDTEXT

			Strtofile(lcSettings, This.cGeneralIniFile)
		Endif
		Release lcSettings
	Endproc

	Procedure initializeazaSecurity
		Local lnValid
		This.cSecurityFile = This.cDirMare + 'Security\ROA_SECURITY.TXT'
		If !This.lParametri
			lnValid = This.getcrsSecurity()
			If lnValid > 0
				If Used('crsHost')
					Select crsHost
					Go Top
					This.cHost = Alltrim(Host)
					This.cUserName = Alltrim(schema)
					This.cPassword = Alltrim(pwd)
					Use In crsHost
				Endif
			Endif
		Endif
		Release lnValid
	Endproc

	Procedure initializeazaObiecte
		This.oLog = Newobject("Log_Mesaje","Log_Mesaje.prg")
		This.oExecutor = Createobject("oExecutor")
		This.oConn = Createobject("oConn")
		This.oExport = Createobject("oExportConfig")
		This.oMyXMLHTTP = Createobject("MyXMLHTTP", getini(This.cGeneralIniFile,'errors','host'))
		This.oBaraFavorite = Null
		This.oBaraManual = Null
		This.oCalendar = Null
	Endproc

	Procedure initializeazaVariabile
*!*			Public CRLF,CR,LF,Tab
		CR=Chr(13)
		LF=Chr(10)
		CRLF = CR + LF
		Tab=Chr(9)
		Agetfileversion(This.aVersiune,Sys(16,0))
		This.SetCaption(Iif(Alen(This.aVersiune,1)<10,This.cNumeProgram,This.aVersiune(10)))
		This.cStartUpMenu = This.cAppPath + "meniuri\" + This.cNumeProgram + '.mpr'
		This.cStartUpForm = This.cAppPath + "comun\ferestre\frm_login.scx"
	Endproc

	Procedure initializeazaVariabileGlobale
*!*			Public gcNumeProgram, NUMEPROGRAM, MENIUPROGRAM, FUNDALPROGRAM
		gcNumeProgram = This.cNumeProgram
		_program = This.cNumeProgram
		NUMEPROGRAM = This.ccaption
		MENIUPROGRAM = This.cStartUpMenu

*!*			Public pcNl, pcAn, gcAcces, gcAppPath, gcAppName, gcUtilizatoriPath, gcDirMare, DIRGEN, gcTempPath, ;
*!*				glParametri, gcHost, gcUsername, gcPassword, gcUserNameApp, gcPasswordApp, gnIdUtil, gnIdProgram, ;
*!*				gnAn, gnLuna, gcS, gnIdFirma, gcGeneralIniFile, gcSecurityFile, gnHandle, gnButon, BUTON, gcFirma, gcBasePath
		Store "" To pcNl,pcAn  			&& se initializeaza in start00
		gcAcces = []
		gcAppPath = This.cAppPath
		gcAppName = This.cAppName
		gcUtilizatoriPath = This.cUtilizatoriPath
		gcDirMare = This.cDirMare
		gcComunPath = This.cDirMare+[COMUNROA\]
		DIRGEN = This.cDirMare
		gcBasePath = This.cDirMare
		gcTempPath = []					&&	o citesc in oinit_optiuni.prg
		glParametri = This.lParametri
		gcHost = This.cHost
		gcUsername = This.cUserName
		gcPassword = This.cPassword
		gcUserNameApp = []				&&	le citesc in frm_login
		gcPasswordApp = []				&&
		gnIdUtil = This.nIdUtil
		gnIdProgram = This.nIdProgram
		gnAn = This.nAn
		gnLuna = This.nLuna
		gcS = This.cSchema
		gnIdFirma = This.nIdFirma
		If !Empty(Nvl(This.cLocalePath,[]))
			Private gcLocalePath, goLocale, glTraducere
			gcLocalePath = This.cLocalePath
			glTraducere = This.lTraducere
			goLocale = This.oLocale
		Endif
		gcLocale = This.oLocale.locale
		gcGeneralIniFile = This.cGeneralIniFile
		gcSettingsFile = This.cGeneralIniFile
		gcSecurityFile = This.cSecurityFile
		gnHandle = -1
		gnButon = 2
		BUTON = 2
		gcFirma = []
		glFontCharSet = This.lFontCharSet
		gcReportPreviewer = This.cReportPreviewer
		gcReportPreviewerPath = This.cReportPreviewerPath

*!*			Private gcCopyRight, pcTitlu
		pcTitlu = []
		gcCopyRight = '© ROA Romfast SRL'

*!*			Private glUltimaLuna, glPrimaLuna, glLunaBuna, glLuna_neplatita, glLunaInchisa
*!*			Private glQuit, pl_verificat
		Store .F. To glUltimaLuna, glPrimaLuna, glLunaBuna, glLuna_neplatita, glLunaInchisa
		Store .F. To glQuit, pl_verificat

*!*			Public gnewcryptfll, gnewcryptxml, gTransferTotal
		Store -1 To gTransferTotal
		gnewcryptfll = This.lnewcryptfll
		gnewcryptxml = This.lnewcryptxml
&&	ALTELE
*!*			Declare nror[65000]
*!*			Declare RTVA[22,2]
*!*			Public luna_inchisa, luna_neplatita, PRIMADATA, m.ctva, m.ctvam, m.ctvai, antet, m.nivel
*!*			Public OStart,OSETVIZ,OSETTULBAR,OSETINSTRUM,orm,OTEXT,OJUR,osetgest,tlbr_INSTR,tlbr_VIZ,oprinc
*!*			Public pcapsocsub,pcapsocvar
		pcapsocsub=0
		pcapsocvar=0
*!*			Public a4
		a4=.T.
		m.nrgrup=999

		Store .F. To luna_inchisa,tlbr_INSTRum,tlbr_VIZ
		Store 1 To col_menu
		Store .T. To PRIMADATA,luna_neplatita

		This.initializeazaAlteVariabileGlobale()
	Endproc

	Procedure initializeazaAlteVariabileGlobale
*!*	suprascrisa in fiecare aplicatie care are variabile globale suplimentare
	Endproc

	Procedure initializeazaObiecteGlobale
*!*			Private poLog, goLog, oTool, oHelp, goExecutor, goConn, goMyXMLHTTP, goCalendar, goExport, goUtilizator, goFundal, goFirma
		poLog = This.oLog
		goLog = This.oLog
		oTool = This.oBaraFavorite
		oHelp = This.oBaraManual
		goExecutor = This.oExecutor
		goConn = This.oConn
		goMyXMLHTTP = This.oMyXMLHTTP
		goCalendar = This.oCalendar
		goExport = This.oExport
		goUtilizator = Null
		goFundal = Null
		goFirma = Null

		This.initializeazaAlteObiecteGlobale()
	Endproc

	Procedure initializeazaAlteObiecteGlobale
*!*	suprascrisa in fiecare aplicatie care are obiecte globale suplimentare
	Endproc

	Procedure lanseazaAplicatie
		_Screen.Visible = .T.
		_Screen.WindowState=2

		This.DoMenu(This.cStartUpMenu)
		This.DoForm(This.cStartUpForm)
		This.ReadEvents()
	Endproc

	Procedure getcrsSecurity
		Lparameters tcSecurityFile
*!* SECURITY.TXT - NECRIPTAT
*!* SECURITY.XML - CRIPTAT
*!* DACA EXISTA SECURITY.XML - PARSEZ XML, ALTFEL PARSEZ TXT
*!* gnewcryptxml - daca roa_security.xml are criptare noua(blowfish)
*!* gnewcryptfll - daca exista vfpencryption.fll
*!* 19.05.2009
*!* nu mai exista fisiere roa_security.xml cu criptarea veche (windows api)
*!*		gnewcryptxml=.F.

		Local lcSecurityFile, lcSecurityPath, lcCursor, lnValid, llSucces, lcSecurityFileXML
		lcCursor = "crsHost"
		If !Empty(tcSecurityFile)
			lcSecurityFile = tcSecurityFile
		Else
			lcSecurityFile = This.cSecurityFile
		Endif
		lcSecurityFileXML = Forceext(lcSecurityFile,'xml')
		lcSecurityPath = Addbs(Justpath(lcSecurityFile))
		lnValid = 0
		llSucces = .T.
		If !Directory(lcSecurityPath)
			Try
				Md (lcSecurityPath)
			Catch
				aMessagebox('Nu se poate crea directorul ' + lcSecurityPath + '!',0+16,'Atentie')
			Endtry
		Endif

		If !(File(lcSecurityFile) Or File(lcSecurityFileXML))
			Cd (lcSecurityPath)
			If !File(lcSecurityFileXML)
				lcSecurityText = 'ROA;CONTAFIN_ORACLE;123;'
				lcSecurityText = Inputbox('Host(DSN);SCHEMA;SCHEMA_PASSWORD;1;','Server',lcSecurityText)
				lcSecurityText = Alltrim(lcSecurityText)
				If !Empty(lcSecurityText)
					If Right(lcSecurityText,1) # ';'
						lcSecurityText = lcSecurityText + ';'
					Endif
				Else
					llSucces = .F.
				Endif
			Endif

			If llSucces
				Try
					If !(File(lcSecurityFileXML) Or File(lcSecurityFile))
*!* SECURITY.TXT
						Strtofile(lcSecurityText, lcSecurityFile)
*!* SECURITY.TXT ^
					Endif
*!* SECURITY.XML
					If !File(lcSecurityFileXML)
						Create Cursor cXML (Host c(50), schema c(50), pwd c(50))
						Insert Into cXML (Host, schema, pwd) Values("ROA","CONTAFIN_ORACLE","ENCRYPTED PWD")
						Cursortoxml("cXML",lcSecurityFileXML, 1, 512, 0, "1")
						Use In cXML
					Endif
*!* SECURITY.XML ^
				Catch
					aMessagebox('Nu s-a putut crea fisierul ' + lcSecurityFile,0+16,'Atentie')
					llSucces = .F.
				Endtry
			Endif
		Endif

		If llSucces
			If !File(lcSecurityFile) And !File(lcSecurityFileXML)
				aMessagebox('Nu exista fisierul ' + lcSecurityFile,0+16,'Atentie')
				llSucces = .F.
			Endif
		Endif

		If llSucces
			If Used(lcCursor)
				Use In (lcCursor)
			Endif

&& daca exista security.xml - il transform in cursorul cXML si completez crsHost
			Create Cursor (lcCursor)(Host c(100), schema c(100), pwd v(100), IsEncrypted c(1))
			If File(lcSecurityFileXML)
				Try
					lcSecurityText = Filetostr(lcSecurityFileXML)
					Xmltocursor(lcSecurityFileXML, "cXML", 512)
					Select cXML
					Go Top
					Scatter Name lofirstrecord

					If lofirstrecord.Host="ENCRYPTION"
						This.lnewcryptxml=.T.
						Delete
					Else
						This.lnewcryptxml=.F.
					Endif

					Insert Into (lcCursor) (Host, schema, pwd, IsEncrypted) ;
						SELECT Host, schema, pwd, "1" As IsEncrypted ;
						FROM cXML
					lnValid = Reccount('cXML')

					Use In cXML
				Catch To loex
					goApp.ErrorHandler(loex.ErrorNo,loex.Procedure,loex.Lineno)
				Finally
					Use In (Select('cXML'))
				Endtry

			Else
*			CREATE CURSOR (lcCursor)(HOST c(100), Schema c(100), Pwd v(100), IsEncrypted c(1))
				lcSecurityText = Filetostr(lcSecurityFile)
				Local laHost
				Dimension laHost[1]

				lnLen = Alines(laHost, lcSecurityText)

				If lnLen > 0
					For i = 1 To lnLen
						lcLinie = laHost[i]

						lcHost = Getwordnum(lcLinie, 1, ';')
						lcSchema = Getwordnum(lcLinie, 2, ';')
						lcPassword = Getwordnum(lcLinie, 3, ';')
						lcMode = "0" && necriptat - security.txt

						If Empty(lcHost) Or Empty(lcSchema) Or Empty(lcPassword)
							Loop
						Endif

						lnValid = lnValid + 1
						Insert Into &lcCursor (Host, schema, pwd, IsEncrypted) Values (lcHost, lcSchema, lcPassword, Iif(Empty(lcMode), '0', lcMode))
					Endfor
				Endif
			Endif
		Endif

		Return lnValid
	Endproc

	Procedure Release
		RETURN 
		If Not This.ReleaseForms()
			Return .F.
		Endif
		This.ClearEvents()
		Release This
	Endproc

*-- Executes an SCX form.
	Procedure DoForm
		Lparameters tcFileName,tcClass,tlNoMultipleInstances,tlNoShow
		Local lcFileName,lcClass,oForm,oForm2,lcName,lnCount,lnTop,lnLeft
		Local lcFormName,lnFormCount
		_Screen.Visible=.T.
		lcFileName=Alltrim(tcFileName)
		If Empty(lcFileName)
			Return .F.
		Endif
		lcClass=Iif(Type("tcClass")=="C",Lower(Alltrim(tcClass)),"")
		lcFileName=Lower(Fullpath(lcFileName))
		If Not "."$lcFileName
			lcFileName=lcFileName+Iif(Empty(lcClass),".scx",".vcx")
		Endif
		If Not File(lcFileName)
			This.FileNotFoundMsgBox(lcFileName)
			Return .F.
		Endif
		lcFormName=Iif(Empty(lcClass),lcFileName,lcFileName+","+lcClass)
		If tlNoMultipleInstances
			For lnCount = 1 To This.nformcount
				If This.aformnames[lnCount]==lcFormName And ;
						TYPE("this.aForms[lnCount]")=="O" And ;
						NOT Isnull(This.aforms[lnCount])
					This.aforms[lnCount].Show
					Return .F.
				Endif
			Endfor
		Endif
		This.RefreshFormsCollection
		This.nformcount=This.nformcount+1
		Dimension This.aforms[this.nFormCount],This.aformnames[this.nFormCount]
		This.aformnames[this.nFormCount]=lcFormName
		If Not Empty(lcClass)
			Set Classlib To (lcFileName) Additive
			This.aforms[this.nFormCount]=Createobject(lcClass)
			If Not tlNoShow And Type("this.aForms[this.nFormCount]")=="O" And ;
					NOT Isnull(This.aforms[this.nFormCount])
				This.aforms[this.nFormCount].Show
			Endif
		Else
			Do Form (lcFileName) Name This.aforms[this.nFormCount] Linked Noshow
		Endif
		lnFormCount=This.nformcount
		This.RefreshFormsCollection
		If This.lcascadeforms And This.nformcount>=lnFormCount
			oForm=This.aforms[this.nFormCount]
			lnTop=oForm.Top
			lnLeft=oForm.Left
			lcName=oForm.Name
			If Wexist(lcName) And oForm.WindowState#2
				For lnCount = 1 To (This.nformcount-1)
					oForm2=This.aforms[lnCount]
					If Type("oForm2")#"O" Or Isnull(oForm2)
						Loop
					Endif
					If lcName==oForm2.Name And Wlrow(lcName)=Wlrow(oForm2.Name) And ;
							WLCOL(lcName)=Wlcol(oForm2.Name)
						lnTop=lnTop+This.npixeloffset
						lnLeft=lnLeft+This.npixeloffset
					Endif
				Endfor
				If oForm.Top#lnTop
					oForm.Top=lnTop
				Endif
				If oForm.Left#lnLeft
					oForm.Left=lnLeft
				Endif
			Endif
		Endif

		If !(tlNoShow Or ('LOGIN'$Upper(lcFileName) And This.lParametri))
			This.aforms[this.nFormCount].Show
		Endif
	Endproc

	Procedure DoMenu
		Lparameters tcFileName
		Local lcFileName
		lcFileName=Alltrim(tcFileName)
		If Empty(lcFileName)
			Return .F.
		Endif
		If At('.', lcFileName) = 0
			lcFileName = lcFileName + '.mpr'
		ENDIF

		If File(lcFileName)
			If Type('This.oLocale') = '0'
				This.oLocale.SetMenu(lcFileName,"menu", Null)
			Endif
			Do &lcFileName
		Endif
	Endproc

	Procedure ClearEvents
		Clear Events
	Endproc

*-- Starts read events mode.
	Procedure ReadEvents
		This.BeforeReadEvents()
		
		RETURN 
		
		If This.lreadevents
			Read Events
		Endif
	Endproc

*-- Sets the caption of the application.
	Procedure SetCaption
		Lparameters tcCaption

		If Type("tcCaption")#"C"
			Return .F.
		Endif
		This.ccaption=tcCaption
		_Screen.Caption=tcCaption
	Endproc


*-- Sets the icon of the application.
	Procedure seticon
		Lparameters tcIcon
		If Type("tcIcon")#"C"
			Return .F.
		Endif
		This.cicon=tcIcon
		_Screen.Icon=tcIcon
	Endproc

*-- Returns the caption of the application.
	Procedure getcaption
		Return This.ccaption
	Endproc

*-- Returns the icon of the application.
	Procedure geticon
		Return This.cicon
	Endproc

*-- Occurs when the user attempts to exit Visual FoxPro.
	Procedure onShutDown
		Local loMesaj

		If This.lQuit
			Quit
		Endif

		loMesaj=Createobject('frm_mesaj', This.cNumeProgram ,'intreb.ico','INTREBARE','Doriți să ieșiți din program?')
		loMesaj.lbl_mesaj1.FontBold=.T.
		loMesaj.lbl_mesaj1.FontSize=12
		loMesaj.lbl_mesaj1.Top=55
		loMesaj.Show(1)
		If BUTON=1
			On Shutdown
			On Error
			*Clear Events
			If _vfp.StartMode <> 0
				Quit
			Endif
		Endif
	Endproc

*-- Release all application forms from memory.
	Procedure ReleaseForms
		Local lnFormCount

		This.RefreshFormsCollection
		Do While This.nformcount>0
			lnFormCount=This.nformcount
			If Not This.ReleaseForm(This.aforms[lnFormCount]) Or This.nformcount=lnFormCount
				Return .F.
			Endif
		Enddo
	Endproc


*-- Release specifc or active form from memory.
	Procedure ReleaseForm
		Lparameters toForm

		If Parameters()=0
			If Type("_screen.ActiveForm")#"O" Or Isnull(_Screen.ActiveForm)
				Return .F.
			Endif
			_Screen.ActiveForm.Release
		Else
			If Type("toForm")#"O" Or Isnull(toForm)
				Return .F.
			Endif
			toForm.Release
		Endif
		This.RefreshFormsCollection
	Endproc


*-- Reset arrays and counters of forms collection.
	Protected Procedure ResetFormsCollection
		This.nformcount=0
		Dimension This.aforms[1],This.aformnames[1]
		This.aforms=.Null.
		This.aformnames=""
	Endproc


*-- Refresh forms collection arrays and counters.
	Procedure RefreshFormsCollection
		Local lnCount,lnCount2

		lnCount=1
		Do While lnCount<=This.nformcount
			If Type("this.aForms[lnCount]")=="O" And Not Isnull(This.aforms[lnCount])
				lnCount=lnCount+1
				Loop
			Endif
			For lnCount2 = lnCount To (This.nformcount-1)
				This.aforms[lnCount2]=This.aforms[lnCount2+1]
				This.aforms[lnCount2+1]=.Null.
				This.aformnames[lnCount2]=This.aformnames[lnCount2+1]
				This.aformnames[lnCount2+1]=""
			Endfor
			This.nformcount=This.nformcount-1
			If This.nformcount=0
				Exit
			Endif
			Dimension This.aforms[this.nFormCount],This.aformnames[this.nFormCount]
		Enddo
		If This.nformcount=0
			This.ResetFormsCollection
		Endif
	Endproc

	Protected Procedure Destroy
*		Clear Events
*		This.restaureazaEnv()
	Endproc

*-- Method executed before READ EVENTS is executed when ReadEvents is called.
	Protected Procedure BeforeReadEvents
	Endproc

	Function ErrorHandler
	*!*	 de modificat variabilele globale cu proprietati ale obiectului atunci cand 
	*!*	o sa si actualizez proprietatile coresp. obiectului din schimba_firma, etc.
		Lparameters nError,cMethod,nLine
		Local lcErrorMsg,lcCodeLineMsg

		Wait Clear
		lcErrorMsg=Message()+Chr(13)+Chr(13)
		lcErrorMsg=lcErrorMsg+"Metoda:    "+cMethod
		lcCodeLineMsg=Message(1)
		If Between(nLine,1,10000) And Not lcCodeLineMsg="..."
			lcErrorMsg=lcErrorMsg+Chr(13)+"Linia:         "+Alltrim(Str(nLine))
			If Not Empty(lcCodeLineMsg)
				lcErrorMsg=lcErrorMsg+Chr(13)+Chr(13)+lcCodeLineMsg
			Endif
		ENDIF
		lcErrorMsg = m.lcErrorMsg + CHR(13) + CHR(13) + GETCALLSTACK()
		

*!*			If Type('This.oMyXMLHTTP') = 'O'
*!*				lcLunaHTTP = Iif(Type('gnLuna') = 'N', Transform(gnLuna) + "/","") + Iif(Type('GNAN') = 'N', Transform(gnAn),"")
*!*				lcErrorMsgHTTP =  Sys(0) + ":" + Iif(Type('GCS')='C'," " + gcS,"")  + ": " + lcLunaHTTP + Chr(13) +Chr(10) + lcErrorMsg + ;
*!*					CHR(13) +Chr(10) + Chr(13) + Chr(10) + GETCALLSTACK()
*!*				lcUserName = gcUserNameApp
*!*				lcProgram = Juststem(Sys(16,0))
*!*				This.oMyXMLHTTP.postError(lcErrorMsgHTTP, lcUserName, lcProgram)
*!*			Endif

		If aMessagebox(lcErrorMsg,17,_Screen.Caption)#1
			If _vfp.StartMode = 0
				Set Step On
			ELSE
				ON SHUTDOWN 
				ON ERROR 
				Quit
			Endif
		Endif
	Endfunc
	
	FUNCTION ReadIni
		LPARAMETERS tcSection, tcVariable

		lcSection = IIF(!EMPTY(m.tcSection), ALLTRIM(LOWER(m.tcSection)), '')
		lcVariable = IIF(!EMPTY(m.tcVariable), ALLTRIM(LOWER(m.tcVariable)), '')
		lcValue = ''

		IF TYPE('goApi') = 'O' AND !EMPTY(m.lcSection) AND !EMPTY(m.lcVariable)
			 lcValue = goAPI.GetProfileString(m.gcSettingsFile, m.lcSection, m.lcVariable)
		ENDIF 

		RETURN NVL(m.lcValue,'')
	ENDFUNC 
	
	PROCEDURE WriteIni
		LPARAMETERS tcSection, tcVariable, tcValue

		lcSection = IIF(!EMPTY(m.tcSection), ALLTRIM(LOWER(m.tcSection)), '')
		lcVariable = IIF(!EMPTY(m.tcVariable), ALLTRIM(LOWER(m.tcVariable)), '')
		lcValue = IIF(!EMPTY(m.tcValue), ALLTRIM(TRANSFORM(m.tcValue)), '')

		IF TYPE('goApi') = 'O' AND !EMPTY(m.lcSection) AND !EMPTY(m.lcVariable)
			goAPI.WriteProfileString(m.gcSettingsFile, m.lcSection, m.lcVariable, m.lcValue) 
		ENDIF 	
	ENDPROC 	

ENDDEFINE
