*--------------------------------------------------------------------------------------------------------------------------------------------------------
* (EN) AUTOGENERATED - ATTENTION!! - NOT INTENDED FOR EXECUTION!! USE ONLY FOR MERGING CHANGES AND STORING WITH SCM TOOLS!!
*--------------------------------------------------------------------------------------------------------------------------------------------------------
*< FOXBIN2PRG: Version="1.21" SourceFile="locale.vcx" CPID="1252" /> (Solo para binarios VFP 9 / Only for VFP 9 binaries)
*
*
DEFINE CLASS admin AS form 
 	*< CLASSDATA: Baseclass="form" Timestamp="" Scale="Pixels" Uniqueid="" />

	*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder 
	*< OBJECTDATA: ObjPath="pf" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgPhrase.cboSrc" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgPhrase.Label1" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgPhrase.Label2" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgPhrase.Line1" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgPhrase.cboDst" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgPhrase.Label3" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgPhrase.Label4" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgPhrase.edtSrc" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgPhrase.edtDst" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgPhrase.lstPhrase" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgPhrase.Label5" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgPhrase.cmdUpdateAll" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgPhrase.txtNotes" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgPhrase.lblNotes" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.lstSites" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.txtName" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.lblName" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.txtUrl" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.lblUrl" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.edtMarkers" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.lblMarkers" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.txtNotes" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.lblNotes" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.edtPage" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.lblPage" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.txtTimeout" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.lblTimeout" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.txtAttempt" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.lblAttempt" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.txtExclude" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.lblExclude" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.txtHits" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.lblHits" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.txtDuration" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.lblDuration" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.cmdSave" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="pf.pgSite.cmdLang" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="cmdClose" UniqueID="" Timestamp="" />

	*<DefinedPropArrayMethod>
		*m: getphrases
		*p: olocale
	*</DefinedPropArrayMethod>

	*<PropValue>
		AlwaysOnTop = .T.
		AutoCenter = .T.
		BorderStyle = 2
		Caption = "Locale Administration"
		DataSession = 2
		DoCreate = .T.
		Height = 400
		MaxButton = .F.
		MinButton = .F.
		Name = "admin"
		Width = 500
		WindowType = 1
	*</PropValue>

	ADD OBJECT 'cmdClose' AS commandbutton WITH ;
		Cancel = .T., ;
		Caption = "\<Close", ;
		Default = .T., ;
		Height = 27, ;
		Left = 408, ;
		Name = "cmdClose", ;
		TabIndex = 1, ;
		Top = 366, ;
		Width = 84
		*< END OBJECT: BaseClass="commandbutton" />

	ADD OBJECT 'pf' AS pageframe WITH ;
		ErasePage = .T., ;
		Height = 360, ;
		Left = 0, ;
		Name = "pf", ;
		PageCount = 2, ;
		TabIndex = 2, ;
		Top = 0, ;
		Width = 502, ;
		Page1.Caption = "Phrases", ;
		Page1.Name = "pgPhrase", ;
		Page2.Caption = "Sites & Languages", ;
		Page2.Name = "pgSite"
		*< END OBJECT: BaseClass="pageframe" />

	ADD OBJECT 'pf.pgPhrase.cboDst' AS combobox WITH ;
		Height = 24, ;
		Left = 324, ;
		Name = "cboDst", ;
		TabIndex = 4, ;
		Top = 165, ;
		Width = 160
		*< END OBJECT: BaseClass="combobox" />

	ADD OBJECT 'pf.pgPhrase.cboSrc' AS combobox WITH ;
		Height = 24, ;
		Left = 324, ;
		Name = "cboSrc", ;
		TabIndex = 8, ;
		Top = 8, ;
		Width = 160
		*< END OBJECT: BaseClass="combobox" />

	ADD OBJECT 'pf.pgPhrase.cmdUpdateAll' AS commandbutton WITH ;
		Caption = "\<Retranslate All Phrases for All Languages", ;
		Height = 27, ;
		Left = 12, ;
		Name = "cmdUpdateAll", ;
		TabIndex = 7, ;
		Top = 294, ;
		Width = 472
		*< END OBJECT: BaseClass="commandbutton" />

	ADD OBJECT 'pf.pgPhrase.edtDst' AS editbox WITH ;
		Height = 54, ;
		Left = 11, ;
		Name = "edtDst", ;
		TabIndex = 5, ;
		Top = 206, ;
		Width = 473
		*< END OBJECT: BaseClass="editbox" />

	ADD OBJECT 'pf.pgPhrase.edtSrc' AS editbox WITH ;
		DisabledBackColor = 235,235,235, ;
		Height = 109, ;
		Left = 170, ;
		Name = "edtSrc", ;
		ReadOnly = .T., ;
		TabIndex = 2, ;
		Top = 44, ;
		Width = 314
		*< END OBJECT: BaseClass="editbox" />

	ADD OBJECT 'pf.pgPhrase.Label1' AS label WITH ;
		Alignment = 1, ;
		BackStyle = 0, ;
		Caption = "Source Language:", ;
		Height = 17, ;
		Left = 11, ;
		Name = "Label1", ;
		TabIndex = 9, ;
		Top = 11, ;
		Width = 308
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'pf.pgPhrase.Label2' AS label WITH ;
		BackStyle = 0, ;
		Caption = "Phrase", ;
		Height = 17, ;
		Left = 167, ;
		Name = "Label2", ;
		TabIndex = 10, ;
		Top = 29, ;
		Width = 192
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'pf.pgPhrase.Label3' AS label WITH ;
		Alignment = 1, ;
		BackStyle = 0, ;
		Caption = "Destination Language:", ;
		Height = 17, ;
		Left = 95, ;
		Name = "Label3", ;
		TabIndex = 12, ;
		Top = 168, ;
		Width = 224
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'pf.pgPhrase.Label4' AS label WITH ;
		BackStyle = 0, ;
		Caption = "Phrase", ;
		Height = 17, ;
		Left = 11, ;
		Name = "Label4", ;
		TabIndex = 13, ;
		Top = 191, ;
		Width = 192
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'pf.pgPhrase.Label5' AS label WITH ;
		BackStyle = 0, ;
		Caption = "Phrases", ;
		Height = 17, ;
		Left = 11, ;
		Name = "Label5", ;
		TabIndex = 14, ;
		Top = 29, ;
		Width = 144
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'pf.pgPhrase.lblNotes' AS label WITH ;
		Alignment = 1, ;
		BackStyle = 0, ;
		Caption = "Notes", ;
		Height = 17, ;
		Left = 11, ;
		Name = "lblNotes", ;
		TabIndex = 11, ;
		Top = 262, ;
		Width = 82, ;
		WordWrap = .T.
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'pf.pgPhrase.Line1' AS line WITH ;
		Height = 0, ;
		Left = 11, ;
		Name = "Line1", ;
		Top = 160, ;
		Width = 473
		*< END OBJECT: BaseClass="line" />

	ADD OBJECT 'pf.pgPhrase.lstPhrase' AS listbox WITH ;
		Height = 109, ;
		Left = 11, ;
		Name = "lstPhrase", ;
		TabIndex = 1, ;
		Top = 44, ;
		Width = 153
		*< END OBJECT: BaseClass="listbox" />

	ADD OBJECT 'pf.pgPhrase.txtNotes' AS textbox WITH ;
		Height = 23, ;
		Left = 95, ;
		Name = "txtNotes", ;
		TabIndex = 6, ;
		Top = 260, ;
		Width = 389
		*< END OBJECT: BaseClass="textbox" />

	ADD OBJECT 'pf.pgSite.cmdLang' AS commandbutton WITH ;
		Caption = "\<Languages", ;
		Height = 27, ;
		Left = 275, ;
		Name = "cmdLang", ;
		TabIndex = 12, ;
		Top = 296, ;
		Width = 120
		*< END OBJECT: BaseClass="commandbutton" />

	ADD OBJECT 'pf.pgSite.cmdSave' AS commandbutton WITH ;
		Caption = "\<Save", ;
		Enabled = .F., ;
		Height = 27, ;
		Left = 407, ;
		Name = "cmdSave", ;
		TabIndex = 13, ;
		Top = 296, ;
		Width = 84
		*< END OBJECT: BaseClass="commandbutton" />

	ADD OBJECT 'pf.pgSite.edtMarkers' AS editbox WITH ;
		Height = 108, ;
		Left = 83, ;
		Name = "edtMarkers", ;
		TabIndex = 6, ;
		Top = 176, ;
		Width = 156
		*< END OBJECT: BaseClass="editbox" />

	ADD OBJECT 'pf.pgSite.edtPage' AS editbox WITH ;
		Height = 75, ;
		Left = 83, ;
		Name = "edtPage", ;
		TabIndex = 5, ;
		Top = 92, ;
		Width = 408
		*< END OBJECT: BaseClass="editbox" />

	ADD OBJECT 'pf.pgSite.lblAttempt' AS label WITH ;
		Alignment = 1, ;
		AutoSize = .F., ;
		BackStyle = 0, ;
		Caption = "Attempt", ;
		Left = 257, ;
		Name = "lblAttempt", ;
		TabIndex = 20, ;
		Top = 204, ;
		Width = 75, ;
		WordWrap = .T.
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'pf.pgSite.lblDuration' AS label WITH ;
		Alignment = 1, ;
		AutoSize = .F., ;
		BackStyle = 0, ;
		Caption = "Duration", ;
		Left = 381, ;
		Name = "lblDuration", ;
		TabIndex = 23, ;
		Top = 204, ;
		Width = 68, ;
		WordWrap = .T.
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'pf.pgSite.lblExclude' AS label WITH ;
		Alignment = 1, ;
		AutoSize = .F., ;
		BackStyle = 0, ;
		Caption = "Exclude", ;
		Left = 257, ;
		Name = "lblExclude", ;
		TabIndex = 21, ;
		Top = 228, ;
		Width = 75, ;
		WordWrap = .T.
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'pf.pgSite.lblHits' AS label WITH ;
		Alignment = 1, ;
		AutoSize = .F., ;
		BackStyle = 0, ;
		Caption = "Hits", ;
		Left = 381, ;
		Name = "lblHits", ;
		TabIndex = 22, ;
		Top = 180, ;
		Width = 68, ;
		WordWrap = .T.
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'pf.pgSite.lblMarkers' AS label WITH ;
		Alignment = 1, ;
		AutoSize = .F., ;
		BackStyle = 0, ;
		Caption = "Markers", ;
		Left = 5, ;
		Name = "lblMarkers", ;
		TabIndex = 16, ;
		Top = 176, ;
		Width = 75, ;
		WordWrap = .T.
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'pf.pgSite.lblName' AS label WITH ;
		Alignment = 1, ;
		BackStyle = 0, ;
		Caption = "Name", ;
		Left = 173, ;
		Name = "lblName", ;
		TabIndex = 14, ;
		Top = 12, ;
		Width = 50, ;
		WordWrap = .T.
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'pf.pgSite.lblNotes' AS label WITH ;
		Alignment = 1, ;
		BackStyle = 0, ;
		Caption = "Notes", ;
		Left = 173, ;
		Name = "lblNotes", ;
		TabIndex = 17, ;
		Top = 60, ;
		Width = 50, ;
		WordWrap = .T.
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'pf.pgSite.lblPage' AS label WITH ;
		Alignment = 1, ;
		AutoSize = .F., ;
		BackStyle = 0, ;
		Caption = "Page", ;
		Left = 5, ;
		Name = "lblPage", ;
		TabIndex = 18, ;
		Top = 92, ;
		Width = 75, ;
		WordWrap = .T.
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'pf.pgSite.lblTimeout' AS label WITH ;
		Alignment = 1, ;
		AutoSize = .F., ;
		BackStyle = 0, ;
		Caption = "Timeout", ;
		Left = 257, ;
		Name = "lblTimeout", ;
		TabIndex = 19, ;
		Top = 180, ;
		Width = 75, ;
		WordWrap = .T.
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'pf.pgSite.lblUrl' AS label WITH ;
		Alignment = 1, ;
		BackStyle = 0, ;
		Caption = "Url", ;
		Left = 173, ;
		Name = "lblUrl", ;
		TabIndex = 15, ;
		Top = 36, ;
		Width = 50, ;
		WordWrap = .T.
		*< END OBJECT: BaseClass="label" />

	ADD OBJECT 'pf.pgSite.lstSites' AS listbox WITH ;
		Height = 72, ;
		Left = 11, ;
		Name = "lstSites", ;
		TabIndex = 1, ;
		Top = 8, ;
		Width = 156
		*< END OBJECT: BaseClass="listbox" />

	ADD OBJECT 'pf.pgSite.txtAttempt' AS textbox WITH ;
		Height = 23, ;
		Left = 335, ;
		Name = "txtAttempt", ;
		TabIndex = 8, ;
		Top = 200, ;
		Width = 39
		*< END OBJECT: BaseClass="textbox" />

	ADD OBJECT 'pf.pgSite.txtDuration' AS textbox WITH ;
		Height = 23, ;
		Left = 450, ;
		Name = "txtDuration", ;
		TabIndex = 11, ;
		Top = 200, ;
		Width = 40
		*< END OBJECT: BaseClass="textbox" />

	ADD OBJECT 'pf.pgSite.txtExclude' AS textbox WITH ;
		Height = 23, ;
		Left = 335, ;
		Name = "txtExclude", ;
		TabIndex = 9, ;
		Top = 224, ;
		Width = 39
		*< END OBJECT: BaseClass="textbox" />

	ADD OBJECT 'pf.pgSite.txtHits' AS textbox WITH ;
		Height = 23, ;
		Left = 450, ;
		Name = "txtHits", ;
		TabIndex = 10, ;
		Top = 176, ;
		Width = 40
		*< END OBJECT: BaseClass="textbox" />

	ADD OBJECT 'pf.pgSite.txtName' AS textbox WITH ;
		Height = 23, ;
		Left = 227, ;
		MaxLength = 30, ;
		Name = "txtName", ;
		TabIndex = 2, ;
		Top = 8, ;
		Width = 219
		*< END OBJECT: BaseClass="textbox" />

	ADD OBJECT 'pf.pgSite.txtNotes' AS textbox WITH ;
		Height = 23, ;
		Left = 227, ;
		MaxLength = 250, ;
		Name = "txtNotes", ;
		TabIndex = 4, ;
		Top = 56, ;
		Width = 264
		*< END OBJECT: BaseClass="textbox" />

	ADD OBJECT 'pf.pgSite.txtTimeout' AS textbox WITH ;
		Height = 23, ;
		Left = 335, ;
		Name = "txtTimeout", ;
		TabIndex = 7, ;
		Top = 176, ;
		Width = 39
		*< END OBJECT: BaseClass="textbox" />

	ADD OBJECT 'pf.pgSite.txtUrl' AS textbox WITH ;
		Height = 23, ;
		Left = 227, ;
		MaxLength = 100, ;
		Name = "txtUrl", ;
		TabIndex = 3, ;
		Top = 32, ;
		Width = 264
		*< END OBJECT: BaseClass="textbox" />
	
	PROCEDURE Destroy
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    this.oLocale = .NULL.
	ENDPROC

	PROCEDURE getphrases
	ENDPROC

	PROCEDURE Init
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		
		    THISFORM.oLocale.setLocale( THISFORM )
		
		
	ENDPROC

	PROCEDURE Load
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    DO CASE
		    CASE TYPE("thisform.oLocale")="O"
		        this.oLocale = THISFORM.oLocale
		    CASE TYPE("oLocale")="O"
		        this.oLocale = m.oLocale
		    CASE TYPE("_screen.oLocale")="O"
		        this.oLocale = _SCREEN.oLocale
		    OTHERWISE
		        THISFORM.NewObject("oLocale","Locale","Locale.vcx")
		        this.oLocale = THISFORM.oLocale
		    ENDCASE
		
		    RETURN
		
	ENDPROC

	PROCEDURE cmdClose.Click
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    RELEASE THISFORM
		
	ENDPROC

	PROCEDURE pf.pgPhrase.cboDst.Error
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    LPARAMETERS nError, cMethod, nLine
		    RETURN
		
	ENDPROC

	PROCEDURE pf.pgPhrase.cboDst.Init
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		
		
		    THISFORM.oLocale.SQlexec( "select distinct language from locale order by 1 ","qDst", THISFORM.DataSessionId  )
		    this.RowSourceType = 2
		    this.RowSource = 'qDst'
		    GOTO Top IN qDst
		    this.DisplayValue = qDst.language
		
	ENDPROC

	PROCEDURE pf.pgPhrase.cboDst.InteractiveChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		
		
		    THISFORM.oLocale.SQlexec( "SELECT Phrase, Notes  FROM locale WHERE TRIM(LANGUAGE)='"+ALLTRIM(this.VALUE) +"' AND ID="+TRANSFORM(qSrcPhrase.ID) ,"qDstPhrase", THISFORM.DataSessionId )
		
		    this.parent.edtDst.VALUE = qDstPhrase.Phrase
		    this.parent.txtNotes.VALUE = qDstPhrase.Notes
		
	ENDPROC

	PROCEDURE pf.pgPhrase.cboDst.ProgrammaticChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    this.InteractiveChange
	ENDPROC

	PROCEDURE pf.pgPhrase.cboSrc.Error
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    LPARAMETERS nError, cMethod, nLine
		    RETURN
		
	ENDPROC

	PROCEDURE pf.pgPhrase.cboSrc.Init
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		
		
		    THISFORM.oLocale.SQlexec( "select distinct language from locale order by 1 ","qSrc", THISFORM.DataSessionId  )
		    this.RowSourceType = 2
		    this.RowSource = 'qSrc'
		    GOTO Top IN qSrc
		    this.DisplayValue = qSrc.language
		
	ENDPROC

	PROCEDURE pf.pgPhrase.cboSrc.InteractiveChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    THISFORM.oLocale.SQlexec( "SELECT left(Phrase,100) AS phrase2, ID, Phrase FROM locale WHERE TRIM(LANGUAGE)='"+ALLTRIM(this.VALUE) +"' ORDER BY phrase2 ","qSrcPhrase", THISFORM.DataSessionId  )
		
		    this.parent.lstPhrase.Init
		
		
	ENDPROC

	PROCEDURE pf.pgPhrase.cboSrc.ProgrammaticChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		
		    this.InteractiveChange
		
	ENDPROC

	PROCEDURE pf.pgPhrase.cmdUpdateAll.Click
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		
		    THISFORM.oLocale.ConvertAll( .T., .T. )
		
		    RETURN
		
		
		
	ENDPROC

	PROCEDURE pf.pgPhrase.edtDst.LostFocus
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		
		    THISFORM.oLocale.SQlexec(" Select ID from Locale WHERE TRIM(LANGUAGE)='"+ALLTRIM(this.parent.cboDst.DisplayValue) +"' AND ID=" + TRANSFORM(qSrcPhrase.ID ), "qtemp", THISFORM.DataSessionId  )
		    IF NOT EOF("qtemp")
		        THISFORM.oLocale.SQlexec(" UPDATE Locale SET Phrase='"+this.VALUE+"', Notes='"+this.parent.txtNotes.VALUE+"' WHERE TRIM(LANGUAGE)='"+ALLTRIM(this.parent.cboDst.DisplayValue) +"' AND ID=" + TRANSFORM(qSrcPhrase.ID ), , THISFORM.DataSessionId  )
		    ELSE
		        THISFORM.oLocale.SQlexec(" Insert into Locale (ID,Language, Phrase,Notes) value ("+TRANSFORM(qSrcPhrase.ID)+",'"+ALLTRIM(this.parent.cboDst.DisplayValue) +"','"+this.VALUE+"','"+this.parent.txtNotes.VALUE+"')",, THISFORM.DataSessionId  )
		    ENDIF
		
		
	ENDPROC

	PROCEDURE pf.pgPhrase.edtSrc.Init
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		
		    GOTO Top IN qSrcPhrase
		    this.VALUE = qSrcPhrase.Phrase
		
		
	ENDPROC

	PROCEDURE pf.pgPhrase.Init
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		
		    this.cboSrc.DisplayValue = THISFORM.oLocale.BaseLang
		    this.cboDst.DisplayValue = THISFORM.oLocale.Locale
		    this.lstPhrase.ListIndex = 1
		
		
	ENDPROC

	PROCEDURE pf.pgPhrase.lstPhrase.Init
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    this.RowSourceType = 2
		    this.RowSource = 'qSrcPhrase'
		    this.ColumnCount = 2
		    this.ColumnWidths = '1000,0'
		    this.BoundTo = .T.
		    this.BoundColumn = 1
		
	ENDPROC

	PROCEDURE pf.pgPhrase.lstPhrase.InteractiveChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		
		    this.parent.edtSrc.VALUE = qSrcPhrase.Phrase
		    this.parent.cboDst.InteractiveChange
		
	ENDPROC

	PROCEDURE pf.pgPhrase.lstPhrase.ProgrammaticChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    this.InteractiveChange
	ENDPROC

	PROCEDURE pf.pgPhrase.txtNotes.LostFocus
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/26/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    this.parent.edtDst.LostFocus
		
	ENDPROC

	PROCEDURE pf.pgSite.Activate
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    this.lstSites.ListIndex = 1
		    this.lstSites.InteractiveChange
	ENDPROC

	PROCEDURE pf.pgSite.cmdLang.Click
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		
		    LOCAL dbfLang
		    dbfLang  = SYS(3)
		
		    *--------------------------------------------
		    *  get copy of language for this site.
		    *--------------------------------------------
		    THISFORM.oLocale.SQlexec( "Select * from Locale_Lang where Locale_lang.SiteID="+TRANSFORM(q_Sites.ID)+" order by name asc", "qLang1", THISFORM.DataSessionId  )
		    SELECT qLang1
		    COPY TO (dbfLang)
		    USE (dbfLang) ALIAS qLang IN (SELECT("qLang"))
		
		    *--------------------------------------------
		    *  Open Browse window to modify
		    *--------------------------------------------
		    BROWSE Fields Name:20:H=oLocale.GetString("Name"), ;
		        Abbr:10:H=oLocale.GetString("Abbreviation"), ;
		        CP:10:H=oLocale.GetString("Code Page"), ;
		        Rule1:H=oLocale.GetString("Rule 1"), ;
		        Rule2:H=oLocale.GetString("Rule 2"), ;
		        Exclude:H=oLocale.GetString("Exclude") ;
		        TITLE oLocale.GetString("Locale - Languages for selected site.")
		
		    *--------------------------------------------
		    *  Update original table.
		    *--------------------------------------------
		    SELECT qLang
		    SCAN all
		        THISFORM.oLocale.SQlexec( "Update Locale_Lang "+;
		            "set Name='"+ALLTRIM(TRANSFORM(qLang.Name))+"',"+;
		            "Abbr='"+ALLTRIM(TRANSFORM(qLang.Abbr))+"',"+;
		            "CP="+ALLTRIM(TRANSFORM(qLang.CP))+","+;
		            "Rule1='"+ALLTRIM(TRANSFORM(qLang.Rule1))+"',"+;
		            "Rule2='"+ALLTRIM(TRANSFORM(qLang.Rule2))+"',"+;
		            "Exclude="+alltrim(TRANSFORM(qLang.Exclude))+" "+;
		            "where Id="+TRANSFORM(qLang.ID),, THISFORM.DataSessionId  )
		    ENDSCAN
		
		    *--------------------------------------------
		    *  Close temporarty table, and erase
		    *--------------------------------------------
		    USE IN qLang
		    ERASE (dbfLang)
		
		    RETURN
		
		
		
		
	ENDPROC

	PROCEDURE pf.pgSite.cmdSave.Click
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		
		    THISFORM.oLocale.SQlexec("Update Locale_Source Set "+;
		        "Name='"+TRANSFORM(this.parent.txtName.VALUE)+"',"+;
		        "url='"+TRANSFORM(this.parent.txturl.VALUE)+"',"+;
		        "Markers='"+TRANSFORM(this.parent.edtMarkers.VALUE)+"',"+;
		        "Page='"+TRANSFORM(this.parent.edtPage.VALUE)+"',"+;
		        "Notes='"+TRANSFORM(this.parent.txtNotes.VALUE)+"',"+;
		        "Timeout="+TRANSFORM(this.parent.txtTImeout.VALUE)+","+;
		        "Attempt="+TRANSFORM(this.parent.txtAttempt.VALUE)+","+;
		        "Exclude="+TRANSFORM(this.parent.txtExclude.VALUE)+","+;
		        "Hits="+TRANSFORM(this.parent.txtHits.VALUE)+","+;
		        "Duration="+TRANSFORM(this.parent.txtDuration.VALUE)+" "+;
		        "where ID="+TRANSFORM(q_Sites.ID),, THISFORM.DataSessionId  )
		
		    this.parent.cmdSave.Enabled = .F.
		
		    RETURN
		
		
		
		
	ENDPROC

	PROCEDURE pf.pgSite.edtMarkers.InteractiveChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/26/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    this.parent.cmdSave.Enabled = .T.
		
	ENDPROC

	PROCEDURE pf.pgSite.edtPage.InteractiveChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/26/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    this.parent.cmdSave.Enabled = .T.
		
	ENDPROC

	PROCEDURE pf.pgSite.lstSites.Init
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    THISFORM.oLocale.SQlexec( "Select Name, id from Locale_Source order by Name","q_Sites", THISFORM.DataSessionId )
		    this.RowSourceType = 2
		    this.RowSource = 'q_Sites'
		    this.ColumnCount = 2
		    this.ColumnWidths = '1000,0'
		    this.BoundTo = .T.
		    this.BoundColumn = 1
		
		
	ENDPROC

	PROCEDURE pf.pgSite.lstSites.InteractiveChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/19/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		
		    THISFORM.oLocale.SQlexec( "Select * from Locale_Source where ID="+TRANSFORM(q_Sites.ID), "q_Sites2", THISFORM.DataSessionId  )
		    this.parent.txtName.VALUE = q_sites2.Name
		    this.parent.txturl.VALUE = q_sites2.url
		    this.parent.edtMarkers.VALUE = q_sites2.Markers
		    this.parent.edtPage.VALUE = q_sites2.Page
		    this.parent.txtNotes.VALUE = q_sites2.Notes
		    this.parent.txtTImeout.VALUE = q_sites2.Timeout
		    this.parent.txtAttempt.VALUE = q_sites2.Attempt
		    this.parent.txtExclude.VALUE = q_sites2.Exclude
		    this.parent.txtHits.VALUE = q_sites2.Hits
		    this.parent.txtDuration.VALUE = q_sites2.Duration
		
		
		
	ENDPROC

	PROCEDURE pf.pgSite.txtAttempt.InteractiveChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/26/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    this.parent.cmdSave.Enabled = .T.
		
	ENDPROC

	PROCEDURE pf.pgSite.txtDuration.InteractiveChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/26/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    this.parent.cmdSave.Enabled = .T.
		
	ENDPROC

	PROCEDURE pf.pgSite.txtExclude.InteractiveChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/26/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    this.parent.cmdSave.Enabled = .T.
		
	ENDPROC

	PROCEDURE pf.pgSite.txtHits.InteractiveChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/26/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    this.parent.cmdSave.Enabled = .T.
		
	ENDPROC

	PROCEDURE pf.pgSite.txtName.InteractiveChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/26/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    this.parent.cmdSave.Enabled = .T.
		
	ENDPROC

	PROCEDURE pf.pgSite.txtNotes.InteractiveChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/26/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    this.parent.cmdSave.Enabled = .T.
		
	ENDPROC

	PROCEDURE pf.pgSite.txtTimeout.InteractiveChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/26/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    this.parent.cmdSave.Enabled = .T.
		
	ENDPROC

	PROCEDURE pf.pgSite.txtUrl.InteractiveChange
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/26/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    this.parent.cmdSave.Enabled = .T.
		
	ENDPROC

ENDDEFINE

DEFINE CLASS display AS container 		&& Allow for interactive changing of Locale
 	*< CLASSDATA: Baseclass="container" Timestamp="" Scale="Pixels" Uniqueid="" />

	*-- OBJECTDATA items order determines ZOrder / El orden de los items OBJECTDATA determina el ZOrder 
	*< OBJECTDATA: ObjPath="cmdUpdate" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="cboLocale" UniqueID="" Timestamp="" />
	*< OBJECTDATA: ObjPath="Label2" UniqueID="" Timestamp="" />

	*<DefinedPropArrayMethod>
		*p: cthisform		&& Override the references to public oLocale
		*p: olocale
	*</DefinedPropArrayMethod>

	*<PropValue>
		BackStyle = 0
		BorderWidth = 0
		cthisform = 
		Height = 24
		Name = "display"
		olocale = .NULL.
		Width = 395
	*</PropValue>

	ADD OBJECT 'cboLocale' AS combobox WITH ;
		Height = 24, ;
		Left = 156, ;
		Name = "cboLocale", ;
		RowSource = "SELECT DISTINCT name from locale_lang ORDER BY  name where not exclude  into CURSOR qLang", ;
		RowSourceType = 3, ;
		StatusBarText = "Change languages for this form", ;
		Style = 2, ;
		ToolTipText = "Change languages for this form", ;
		Top = 0, ;
		Width = 100, ;
		ZOrderSet = 28
		*< END OBJECT: BaseClass="combobox" />

	ADD OBJECT 'cmdUpdate' AS commandbutton WITH ;
		Caption = "Locale Options", ;
		Height = 22, ;
		Left = 264, ;
		Name = "cmdUpdate", ;
		StatusBarText = "Manage the languages and translated phrases.", ;
		ToolTipText = "Regenerate all captions and tips", ;
		Top = 1, ;
		Width = 130
		*< END OBJECT: BaseClass="commandbutton" />

	ADD OBJECT 'Label2' AS label WITH ;
		Alignment = 1, ;
		BackStyle = 0, ;
		Caption = "Language:", ;
		Height = 17, ;
		Left = 0, ;
		Name = "Label2", ;
		ToolTipText = "Change language to change captions to that language.", ;
		Top = 5, ;
		Width = 153, ;
		ZOrderSet = 29
		*< END OBJECT: BaseClass="label" />
	
	PROCEDURE Destroy
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/16/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    USE IN (SELECT("qLang"))
		    this.oLocale = .NULL.
		
		
	ENDPROC

	PROCEDURE Init
		    *------------------------------------------------------------
		    * Description:
		    * Parameters:  <para>, <req/opt>, D=<def>, <desc>
		    * Return:
		    * Use:
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 02/16/2004  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		
		    DO CASE
		*%% Gregory L Reichert 06/12/2004 DISPLAY.INIT : 600 : Added as a suggestion from Bhavbhuti 
			case (NOT EMPTY("THIS.cThisform")) AND TYPE(THIS.cThisform + ".oLocale")="O"
		        this.oLocale = evaluate( THIS.cThisNewProperty + ".oLocale" )
		
		    CASE TYPE("thisform.oLocale")="O"
		        this.oLocale = THISFORM.oLocale
		    CASE TYPE("m.oLocale")="O"
		        this.oLocale = m.oLocale
		    CASE TYPE("_screen.oLocale")="O"
		        this.oLocale = _SCREEN.oLocale
		    OTHERWISE
		        THISFORM.NewObject("oLocale","Locale","Locale.vcx")
		        this.oLocale = THISFORM.oLocale
		    ENDCASE
		
		    this.cboLocale.ControlSource = "this.parent.oLocale.Locale"
		    this.cboLocale.BoundTo = .T.
		
		    RETURN
		
	ENDPROC

	PROCEDURE cmdUpdate.Click
		    *------------------------------------------------------------
		    * Description: Open the Administration Form
		    * Parameters:  n/a
		    * Return:      n/a
		    * Use:         n/a
		    *------------------------------------------------------------
		    * Id Date        By         Description
		    *  1 08/14/2003  Gregory L Reichert Initial Creation
		    *------------------------------------------------------------
		    LOCAL oAdmin
		    oAdmin=NewObject("Admin","Locale.vcx")
		    oAdmin.Show
		
		    *--------------------------------------------
		    *  upon return, bring the form forward
		    *--------------------------------------------
		    LOCAL aot
		    aot = THISFORM.AlwaysOnTop
		    THISFORM.AlwaysOnTop =.T.
		    THISFORM.AlwaysOnTop = aot
		    this.SetFocus
		
		    *--------------------------------------------
		    *  re-establish the translated phrases
		    *--------------------------------------------
			this.parent.oLocale.Locale = this.parent.oLocale.Locale
		
		
		    RETURN
		
		
		
	ENDPROC

ENDDEFINE

DEFINE CLASS locale AS container 
 	*< CLASSDATA: Baseclass="container" Timestamp="" Scale="Pixels" Uniqueid="" />

	*<DefinedPropArrayMethod>
		*m: arraylookup		&& Search the aLocale array for a phrase
		*m: callsite		&& Call a site and retreives the translated text
		*m: captioncount		&& Count all possible text that can be trnaslated
		*m: closepopup		&& Closes popup internet window.   This sometimes occurs with access Dictionary.com
		*m: convertall		&& Convert all Base phrases to all Languages
		*m: dolabel		&& Translates and runs a Label
		*m: doreport		&& Translated and runs a report,
		*m: getstring		&& Translate a string from the BaseLang to a specific language
		*m: getwindows
		*m: loadarray		&& Loads the internal array with the current language translations.
		*m: locale_assign
		*m: ping		&& Test to see if Internet is available.
		*m: registry		&& Get and Put to the Registry
		*m: setlocale		&& Translates a object and child objects.
		*m: setmenu		&& Runs and translates captions on menu.
		*m: setup
		*m: sqlexec		&& Executes SQL statement either locally or remotely.
		*m: translate		&& Translate a phrase to a different language
		*m: translate_property		&& Translates a single property of an object
		*m: unescape		&& Remove HTML conversions
		*p: baselang		&& Base source locale
		*p: debug		&& If true, display debug information while translating.
		*p: disable_images		&& Disables the images on the page.  They are not downloaded for speed.
		*p: fromregistry		&& if True, the current locale is store and retreived from the Registry.  HKEY_CURRENT_USER\Software\Locale\Locale
		*p: lastphrase		&& Last phrase translated, if the next phrase is the same, then LastTrasnlation is return instead of quering the Internet.
		*p: lasttranslation		&& Last translated phrase
		*p: lclosepopup		&& If true, any popup browser window that opens while translating is closed.
		*p: llocale
		*p: llsucces
		*p: locale		&& Current Locale
		*p: ltranslateactiveform
		*p: nallsitesattempt		&& The number a times any single site is queried before giving up and moving to the next site.
		*p: ncount		&& Number of words translated during this session.
		*p: notranslation_attempt		&& If true, none of the site tested could produce a translation.
		*p: online		&& if true, the internet is accessable.
		*p: property_list		&& List of properties that need to be translated.
		*p: quite		&& Pervents the WAIT window during translation.
		*p: resetsites		&& Reset all sites to give each a equal change at trtanslating.
		*p: searchinternet
		*p: sqlconnect		&& SQL Connection Handle. default -1
		*p: sqlconnectionstring		&& Valid SQL Connection String.  If blank, SQL statement are called as VFP.
		*p: translate_color		&& The color the text assumes will translation is occuring.  If -1, color does not change.
		*p: usedchar		&& Used to Hot Key buttons.
		*p: version		&& Class Vesion Number
		*a: alocale[1,2]		&& Collection of language translations
		*a: amenu[1,3]
		*a: awindows[1,2]		&& List of openned OS Windows.
	*</DefinedPropArrayMethod>

	HIDDEN ActiveControl,AddObject,AddProperty,BackColor,BackStyle,BorderColor,BorderWidth,Click,CloneObject,ColorSource,ControlCount,Controls,DblClick,Destroy,DragDrop,DragIcon,DragMode,DragOver,Drag,Draw,ForeColor,GotFocus,Height,HelpContextID,LostFocus,MiddleClick,MouseDown,MouseEnter,MouseIcon,MouseLeave,MouseMove,MousePointer,MouseUp,MouseWheel,Moved,Move,NewObject,Objects,OLECompleteDrag,OLEDragDrop,OLEDragMode,OLEDragOver,OLEDragPicture,OLEDrag,OLEDropEffects,OLEDropHasData,OLEDropMode,OLEGiveFeedback,OLESetData,OLEStartDrag,Picture,ReadExpression,ReadMethod,Refresh,RemoveObject,ResetToDefault,Resize,RightClick,SaveAsClass,SetAll,SetFocus,ShowWhatsThis,SpecialEffect,StatusBarText,Style,TabIndex,TabStop,Tag,ToolTipText,UIEnable,Visible,WhatsThisHelpID,Width,WriteExpression,WriteMethod,ZOrder
	PROTECTED alocale,amenu,awindows,lastphrase,lasttranslation,Name,ncount,sqlconnect,usedchar,version
	*<PropValue>
		BackStyle = 0
		baselang = Romana
		BorderColor = 255,0,255
		Comment = "8/18/2003"
		debug = .F.
		disable_images = .F.
		Enabled = .T.
		fromregistry = .T.
		Height = 20
		lastphrase = 
		lasttranslation = 
		lclosepopup = .T.
		llocale = .F.
		llsucces = .F.
		locale = English
		ltranslateactiveform = .F.
		nallsitesattempt = 1
		Name = "locale"
		ncount = 0
		notranslation_attempt = .F.
		online = .NULL.
		property_list = Caption,ToolTipText,StatusBarText
		quite = .F.
		resetsites = .F.
		searchinternet = .F.
		sqlconnect = -1
		sqlconnectionstring = 
		TabStop = .F.
		translate_color = (rgb(255,0,0))
		usedchar = ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
		version = 1.50.00299
		Width = 20
	*</PropValue>
	
	PROTECTED PROCEDURE arraylookup		&& Search the aLocale array for a phrase
		*------------------------------------------------------------
		* Description: Locate phrase in translated array.
		* Parameters:
		* Return:
		* Use:
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 02/28/2004  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		LPARAMETERS tcPhrase, tnColumn
		
		LOCAL x, i
		
		*--------------------------------------------
		*  if array is empty, attempt to load it.
		*--------------------------------------------
		IF EMPTY(THIS.aLocale[1,1])
			THIS.LoadArray()
		ENDIF
		
		*--------------------------------------------
		*  Lookup phrase
		*--------------------------------------------
		#IF VERSION(5)>=700
			x = ASCAN(THIS.aLocale,tcPhrase,1,ALEN(THIS.aLocale,1),tnColumn,1+2+4+8)
		#ELSE
			x = 0
			FOR i=1 TO ALEN(THIS.aLocale,1)
				IF tcPhrase==THIS.aLocale[i,tnColumn]
					x=i
					EXIT
				ENDIF
			NEXT
		#ENDIF
		RETURN x
		
	ENDPROC

	PROCEDURE callsite		&& Call a site and retreives the translated text
		*------------------------------------------------------------
		* Description:	Generatces and calles Googles translate page.
		* Parameters:  	tcPhrase, req, Def=, Phrase to be translated.
		* Return:		String: Translated phrase, or original if not able to translated.
		* Use:			internal
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 08/18/2003  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		
		LPARAMETERS tcPhrase
		
		*--------------------------------------------
		*  if object diabled, return original phrase
		*--------------------------------------------
		IF THIS.ENABLED= .F.
			RETURN tcStr
		ENDIF
		
		*--------------------------------------------
		*  if not online, do nothing (suggested by: Bhavbhuti Nathwani )
		*--------------------------------------------
		IF ISNULL(this.online)
			*------------------------------------------------------------
			* Is the internet accessable?
			*------------------------------------------------------------
			THIS.online = THIS.ping("http://www.google.com")
		MESSAGEBOX(TRANSFORM(this.online))	
		ENDIF 
		
		IF NOT THIS.online
			RETURN tcPhrase
		ENDIF
		
		*--------------------------------------------
		*  get the Source and Destination language abbreveations.
		*--------------------------------------------
		
		#DEFINE READYSTATE_UNINITIALIZED 	0
		#DEFINE READYSTATE_LOADING 			1
		#DEFINE READYSTATE_LOADED 			2
		#DEFINE READYSTATE_INTERACTIVE 		3
		#DEFINE READYSTATE_COMPLETE 		4
		
		LOCAL lcSafety
		lcSafety = SET("Safety")
		SET SAFETY OFF
		
		*--------------------------------------------
		*  Get the sites and info for source and destination languages.
		*--------------------------------------------
		THIS.SQlexec( "SELECT "+ ;
			"Locale_source.NAME AS sitename, "+ ;
			"Locale_source.PAGE, "+ ;
			"sLanguages.abbr AS src_abbr, "+ ;
			"dLanguages.abbr AS dst_abbr, "+ ;
			"sLanguages.rule1 AS src_rule, "+ ;
			"dLanguages.rule2 AS dst_rule, "+ ;
			"sLanguages.NAME AS src_Name, "+ ;
			"dLanguages.NAME AS dst_name, "+ ;
			"Locale_source.TIMEOUT, "+ ;
			"Locale_Source.Attempt, "+ ;
			"Locale_source.Markers, "+ ;
			"Locale_source.ID, "+ ;
			"Locale_source.duration/Locale_source.Hits AS Weight "+ ;
			"FROM locale_xref "+ ;
			"INNER JOIN Locale_source ON  locale_xref.siteid = Locale_source.ID "+ ;
			"INNER JOIN Locale_Lang dLanguages ON  dLanguages.ID = locale_xref.dst_langid "+ ;
			"INNER JOIN Locale_Lang sLanguages ON  sLanguages.ID = locale_xref.src_langid "+ ;
			"WHERE  TRIM(sLanguages.NAME) = '"+ THIS.BaseLang +"' "+ ;
			"AND  TRIM(dLanguages.NAME) = '"+ THIS.Locale +"' "+ ;
			"AND  Locale_source.exclude=0 "+ ;
			"", "qSites2" )
		SELECT * FROM qSites2 ORDER BY Weight ASC INTO CURSOR qSites NOFILTER
		USE IN qSites2
		
		LOCAL cHTML, Abbr
		LOCAL slang, dlang
		LOCAL lnTimeOut, lnAttempt, lcMarkers, lcMark, lcTmplName
		LOCAL x,Y, F, ia
		LOCAL lntsec, st
		LOCAL cResult, lcRetValue
		cResult=""
		lcRetValue = tcPhrase
		
		IF TYPE("_VFP.HWND")="N"
			THIS.GetWindows()
		ENDIF
		DECLARE Sleep IN kernel32 INTEGER millisec
		
		IF NOT THIS.quite
			*--------------------------------------------
			*  Display progress
			*--------------------------------------------
			#DEFINE kkMeterString "....:....|....:....|"
			WAIT WINDOW  NOWAIT NOCLEAR "Translating to "+THIS.Locale+CHR(13)+CHR(10);
				+"Words:"+LEFT(kkMeterString,(THIS.ncount%LEN(kkMeterString))+1)+CHR(13)+CHR(10);
				+"Sites:"+LEFT(kkMeterString,(RECNO("qSites")%LEN(kkMeterString))+1)
		ENDIF
		
		SELECT qSites
		THIS.notranslation_attempt = EOF("qSites")
		IF NOT EOF("qSites")
			lcRetValue = ""
			*--------------------------------------------
			*  Walk through each site that have the language
			*--------------------------------------------
			SCAN ALL FOR NOT EOF("qSites")
		
				IF NOT THIS.quite
					#DEFINE kkMeterString "....:....|....:....|"
					WAIT WINDOW  NOWAIT NOCLEAR "Translating to "+THIS.Locale+CHR(13)+CHR(10);
						+"Words:"+LEFT(kkMeterString,(THIS.ncount%LEN(kkMeterString))+1)+CHR(13)+CHR(10);
						+"Sites:"+LEFT(kkMeterString,(RECNO("qSites")%LEN(kkMeterString))+1)
				ENDIF
		
				IF THIS.DEBUG
					ACTIVATE SCREEN
					? qSites.sitename,TRANSFORM(qSites.Weight),tcPhrase," ===> "
				ENDIF
		
				IF THIS.DEBUG
					lcTmplName = FULLPATH("Locale_"+ALLTRIM(qSites.sitename)+".htm")
				ELSE
					lcTmplName = FULLPATH("translate.htm")
				ENDIF
		
				*--------------------------------------------
				*  Create HTML page
				*--------------------------------------------
				tcPhrase = ALLTRIM(tcPhrase)
				cHTML 	= ALLTRIM(qSites.PAGE)
				cHTML 	= STRTRAN(cHTML, "@phrase@", tcPhrase )
				m.Abbr	= ALLTRIM(qSites.src_abbr)
				m.Abbr 	= IIF(EMPTY(ALLTRIM(qSites.src_rule)),m.Abbr,EVALUATE(STRTRAN(ALLTRIM(qSites.src_rule),"@","m.abbr")))
				cHTML 	= STRTRAN(cHTML, "@src_lang@", m.Abbr )
				m.Abbr 	= ALLTRIM(qSites.dst_abbr)
				m.Abbr 	= IIF(EMPTY(ALLTRIM(qSites.dst_rule)),m.Abbr,EVALUATE(STRTRAN(ALLTRIM(qSites.dst_rule),"@","m.abbr")))
				cHTML 	= STRTRAN(cHTML, "@dst_lang@", m.Abbr)
		
				*--------------------------------------------
				*  write HTML page
				*--------------------------------------------
				DO WHILE .T.
					*- Gregory L Reichert 01/30/2004 07:24:25 LOCALE.CALLSITE : (3) : backward compatibility - changed parameter 0 to .F.
					F = STRTOFILE(cHTML,lcTmplName,.F.)
					DO CASE
						CASE F # LENC(cHTML)
							LOOP
						CASE FILETOSTR(lcTmplName) # cHTML
							LOOP
						OTHERWISE
							EXIT
					ENDCASE
				ENDDO
		
				*--------------------------------------------
				*  Get parsing markers
				*--------------------------------------------
				m.slang	= ALLTRIM(qSites.src_Name)
				m.dlang = ALLTRIM(qSites.dst_name)
				m.lcMarkers = ALLTRIM(qSites.Markers)
				LOCAL ARRAY amarkers[ MEMLINES(lcMarkers) ]
				Y=0
				FOR x=1 TO MEMLINES(lcMarkers)
					lcMark = MLINE(lcMarkers,x)
					IF NOT EMPTY(lcMark)
						Y=Y+1
						lcMark = STRTRAN(lcMark,"@slang@",m.slang)
						lcMark = STRTRAN(lcMark,"@dlang@",m.dlang)
						*- Gregory L Reichert 02/26/2004 07:49:57 LOCALE.CALLSITE : (1) : IE has a bad tendency of reformatting html pages from that of the original.  Strip quote marks.
						amarkers[y] = CHRTRANC(lcMark,["'],[])
					ENDIF
				NEXT
		
		
				*--------------------------------------------
				*  Save original values, and turn off images adn sound.
				*--------------------------------------------
				IF THIS.disable_images
					LOCAL ARRAY aKeyVal[4,3]
					aKeyVal[1,1]="Play_Animations"
					aKeyVal[2,1]="Play_Background_Sounds"
					aKeyVal[3,1]="Display Inline Videos"
					aKeyVal[4,1]="Display Inline Images"
		
					FOR ia=1 TO ALEN(aKeyVal,1)
						aKeyVal[ia,3]= 	THIS.Registry( "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\"+aKeyVal[ia,1] )
						THIS.Registry( "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\"+aKeyVal[ia,1] ,"no" )
					ENDFOR
		
				ENDIF
				*--------------------------------------------
				*  Execute the HTML page
				*--------------------------------------------
				*- Gregory L Reichert 02/11/2004 07:03:00 LOCALE.CALLSITE : (1) : use IE directly.
				LOCAL loIE
				loIE=CREATEOBJECT('internetexplorer.application')
				loIE.Silent = .t.			&& no dialogs
		
				m.lnTimeOut = MAX(20,qSites.TIMEOUT)
				m.lnAttempt = MAX(1,qSites.Attempt)
		
				FOR x=1 TO lnAttempt
					lntsec = SECONDS()
		
					loIE.Navigate( lcTmplName )
		
		
					*--------------------------------------------
					*  wait until complete
					*--------------------------------------------
		
					st =  SECONDS()
					Sleep(50)
					DO WHILE .T.
						IF NOT VERSION(5)=700
							DOEVENTS				&& In 7.0, the DoEvents behavior changed to stop and wait for event.  In 8.0, the behavior was changed back to 6.0 behavior.
						ENDIF 
						DO CASE
							CASE loIE.readyState=4 AND NOT loIE.busy
								EXIT
							CASE loIE.readyState=3 AND SECONDS()-st > 5
								EXIT
							CASE SECONDS()-st > m.lnTimeOut
								EXIT
						ENDCASE
						Sleep(50)
					ENDDO
		
		
					*--------------------------------------------
					*  Update site weight for best site for translating
					*--------------------------------------------
					THIS.SQlexec("UPDATE Locale_source SET duration=duration+"+TRANSFORM(SECONDS()-lntsec)+" WHERE ID="+TRANSFORM(qSites.ID) )
		
					IF TYPE("loIE.DOCUMENT.Body.innerHTML")="C"
						cResult = loIE.DOCUMENT.body.innerHTML
						*--------------------------------------------
						*  output the resulting page for auditing
						*--------------------------------------------
						IF THIS.DEBUG
							STRTOFILE( cResult, STRTRAN(lcTmplName , ".HTM","_OUT.HTM"),.F.)
						ENDIF
		
						DO CASE
							CASE EMPTY(cResult)
							CASE ATCC(amarkers[1],cResult)=0
							OTHERWISE
								*- Gregory L Reichert 02/11/2004 07:04:53 LOCALE.CALLSITE : (1)
								*!*						THIS.web.VISIBLE = .F.
								EXIT
						ENDCASE
					ENDIF
		
				NEXT
		
				*--------------------------------------------
				*  Reinstate the original values.
				*--------------------------------------------
				IF THIS.disable_images
					FOR ia=1 TO ALEN(aKeyVal,1)
						THIS.Registry( "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Internet Explorer\Main\"+aKeyVal[ia,1] ,aKeyVal[ia,3] )
					ENDFOR
				ENDIF
		
				*--------------------------------------------
				*  if expected return, parse out the translation
				*--------------------------------------------
				*- Gregory L Reichert 02/26/2004 07:49:57 LOCALE.CALLSITE : (1) : IE has a bad tendency of reformatting html pages from that of the original.  Strip quote marks.
				cResult = CHRTRANC(cResult,["'],[])
				IF ATCC(amarkers[2], cResult)>0
					cResult = SUBSTRC(cResult,ATCC(amarkers[2],cResult))
					cResult = SUBSTRC(cResult, ATCC(amarkers[3],cResult)+LENC(amarkers[3]))
					cResult = ALLTRIM(LEFTC(cResult, ATCC(amarkers[4],cResult)-1))
					IF OCCURS(",",cResult)>OCCURS(",",tcPhrase)
						cResult = LEFTC(cResult,AT_C(",",cResult)-1)
					ENDIF
				ELSE
					cResult = ""
				ENDIF
				IF THIS.DEBUG
					ACTIVATE SCREEN
					?? "("+TRANSFORM(cResult)+")"
				ENDIF
				*--------------------------------------------
				*  if a popup is openned by the web site, close it.
				*--------------------------------------------
				IF TYPE("_VFP.HWND")="N"
					THIS.closepopup()
				ENDIF
		
				*--------------------------------------------
				*  Check and de-encode text
				*--------------------------------------------
				cResult = THIS.UnEscape( cResult )
				IF LEFT(cResult,1)="_" AND LEFT(tcPhrase,1)#"_"
					cResult = ALLTRIM(SUBSTR(cResult,2))
				ENDIF
				IF RIGHT(cResult,1)="_" AND RIGHT(tcPhrase,1)#"_"
					cResult = ALLTRIM(SUBSTR(cResult,LEN(cResult)-1))
				ENDIF
		
				*--------------------------------------------
				*  test for proper translation
				*--------------------------------------------
				DO CASE
					CASE EMPTY(cResult)
						*- found nothing
					CASE OCCURS("?",cResult)>1
						*- failed to translate correctly
					CASE "<"$cResult
						*- skip if pure html
					CASE NOT (cResult==tcPhrase)
		
						*--------------------------------------------
						*  update hit count
						*--------------------------------------------
						THIS.SQlexec( "UPDATE Locale_source SET Hits=Hits+1 WHERE ID="+TRANSFORM(qSites.ID) )
						IF THIS.DEBUG
							ACTIVATE SCREEN
							?? cResult
						ENDIF
						lcRetValue = cResult
						EXIT
					OTHERWISE
						lcRetValue = MAX(lcRetValue, cResult)		&& take the one that is not ""
				ENDCASE
				cResult = ""		&& reset
		
				IF FILE(lcTmplName) AND NOT THIS.DEBUG
					ERASE (lcTmplName)
				ENDIF
			ENDSCAN
		ENDIF
		*--------------------------------------------
		*  clear the web page and disable it
		*--------------------------------------------
		*- Gregory L Reichert 02/11/2004 07:04:37 LOCALE.CALLSITE : (1)
		
		SET SAFETY &lcSafety
		RETURN lcRetValue
		
	ENDPROC

	PROCEDURE captioncount		&& Count all possible text that can be trnaslated
		*------------------------------------------------------------
		* Description: 	Scan for Caption properties, and changes them to Localized version.
		*				Child objects are recurred and change also.
		* Parameters:  	tcObj, req, def=, Base object to be translated.
		* Return:		Count of caption to translate
		* Use:			n = oLocale.CaptionCount( Thisform )
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 07/31/2003  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		
		LPARAMETER tcObj
		
		LOCAL oObj
		LOCAL lnCount
		lnCount = 0
		
		FOR EACH oObj IN tcObj.OBJECTS
		
			lnCount = lnCount + IIF( PEMSTATUS(oObj,"Caption",5) AND (TYPE("oObj.Caption")<>"U") AND NOT EMPTY(oObj.CAPTION) ,1,0)
			lnCount = lnCount + IIF( PEMSTATUS(oObj,"TooltipText",5) AND (TYPE("oObj.TooltipText")<>"U") AND NOT EMPTY(oObj.TOOLTIPTEXT) ,1,0)
			lnCount = lnCount + IIF( PEMSTATUS(oObj,"StatusbarText",5) AND (TYPE("oObj.StatusbarText")<>"U") AND NOT EMPTY(oObj.STATUSBARTEXT) ,1,0)
		
			IF PEMSTATUS(oObj,"Objects",5)
				IF oObj.OBJECTS.COUNT>0
					lnCount = lnCount + THIS.captioncount( oObj )
				ENDIF
			ENDIF
		NEXT
		
		RETURN lnCount
		
	ENDPROC

	PROCEDURE closepopup		&& Closes popup internet window.   This sometimes occurs with access Dictionary.com
		*------------------------------------------------------------
		* Description:	Attempts to close untitled popup browser windows caused by calling translating web sites.
		* Parameters:   tcWindowName, req, def=, Window Title to close.
		* Return:		n/a
		* Use:			internal
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 08/18/2003  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		
		*-- ignore popup windows
		IF NOT THIS.lclosepopup
			RETURN .T.
		ENDIF
		
		LOCAL HWND, x,N, stuffer, lFound
		
		
		* Get the HWND (handle) to the main FoxPro window
		#IF VERSION(5)>=700
			HWND = _VFP.HWND
		#ELSE
			IF FILE(HOME()+"FoxTools.fll")
				SET LIBRARY TO (HOME()+"FoxTools.fll") ADDITIVE
				HWND = EVALUATE("MainHWND()")
				RELEASE LIBRARY (HOME()+"FoxTools.fll")
			ELSE
				THIS.lclosepopup = .F.
				RETURN
			ENDIF
		#ENDIF
		
		* Register the Windows API functions that will be called
		DECLARE INTEGER GetWindowText IN WIN32API;
			INTEGER HWND, ;
			STRING @ lpString, ;
			INTEGER nMaxCount
		
		DECLARE INTEGER GetWindow IN user32;
			INTEGER HWND,;
			INTEGER wFlag
		
		DECLARE SHORT PostMessage IN user32;
			INTEGER   HWND,;
			INTEGER   Msg,;
			STRING  @ wParam,;
			INTEGER   LPARAM
		
		DO WHILE HWND <> 0
		
			stuffer = REPLICATE(CHR(0),512)
			x = GetWindowText(HWND,@stuffer,511)
			stuffer = LEFTC(stuffer,AT_C(CHR(0),stuffer)-1)
		
			IF LENC(TRIM(stuffer)) > 0
		
				lFound = .F.
				FOR N=1 TO ALEN(THIS.aWindows,1)
					lFound = lFound OR (HWND==THIS.aWindows[n,1] ;
						AND stuffer==THIS.aWindows[ n,2 ] ;
						AND NOT LEFTC(stuffer,22)="Visual FoxPro Debugger")
					IF lFound
						EXIT
					ENDIF
				NEXT
				IF NOT lFound
					*-- popup window, close it.
					ACTIVATE SCREEN
					PostMessage(HWND, 0x10, 0, 0)
				ENDIF
			ENDIF
		
			HWND = GetWindow(HWND,2)
		
		ENDDO
		
		*!*		dimension this.aWindows[1,2]
		*!*		this.aWindows[1,1] = 0
		*!*		this.aWindows[1,2] = ""
		
		*- Gregory L Reichert 02/09/2004 07:00:22 LOCALE.CLOSEPOPUP : (1) : remove CLEAR DLLS,  in VFP 6.0, it clears all DLLS.  (suggested by: Bhavbhuti Nathwani )
		
	ENDPROC

	PROCEDURE convertall		&& Convert all Base phrases to all Languages
		*------------------------------------------------------------
		* Description: re-translate all phrases from base to all other languages.
		* Parameters:  n/a
		* Return:      n/a
		* Use:         oLocale.ConvertAll( .T., .T. )
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 09/22/2003  Gregory L Reichert Initial Creation
		*  2 03/08/2004  glr		remove all, allow the baseLang to be addded too.
		*------------------------------------------------------------
		
		LPARAMETERS tlClearOld, tlResetLang
		
		*--------------------------------------------
		*  if object diabled, return original phrase
		*--------------------------------------------
		IF THIS.ENABLED= .F.
			RETURN .T.
		ENDIF
		
		IF tlResetLang
			THIS.SQlexec("UPDATE Locale_Lang SET exclude = .f." )
		ENDIF
		
		LOCAL ARRAY d_lang[1]
		LOCAL ARRAY aPhrase[1]
		THIS.SQlexec( "SELECT distinct Name from Locale_lang WHERE not TRIM(Name)='"+THIS.BaseLang+"' order by 1","qtemp")
		SELECT * FROM qtemp INTO ARRAY d_aLang
		THIS.SQlexec( "SELECT Phrase, padr(Phrase,100) as Phrase2 from Locale WHERE TRIM(Language)='"+THIS.BaseLang+"' order by 2", "qtemp" )
		SELECT * FROM qtemp INTO ARRAY aPhrase
		
		*-- remove all translated phrases.
		IF tlClearOld
			*	this.SQLexec("DELETE FROM Locale" )
			*- Gregory L Reichert 03/08/2004 06:24:56 LOCALE.CONVERTALL : (2) : remove all, allow the baseLang to be addded too.
			THIS.SQlexec("DELETE FROM Locale WHERE not TRIM(Language)='"+THIS.BaseLang+"'" )
			IF ATC("foxpro",THIS.sqlconnectionstring)>0 OR EMPTY(THIS.sqlconnectionstring)
				SELECT Locale
				USE Locale EXCLUSIVE
				PACK
				USE
			ENDIF
		ENDIF
		
		LOCAL x, Y, N, cLast, cResult
		
		FOR x=1 TO ALEN(d_aLang,1)
		
			IF THIS.resetsites
				*-- reset all sites to try all equally.
				THIS.SQlexec( "UPDATE Locale_source SET duration=0.001, hits=1" )
			ENDIF
		
			*-- set destination language
			THIS.Locale = d_aLang[x,1]
		
			*-- translate phrases
			N=0
			cLast = ""
			FOR Y=1 TO ALEN(aPhrase,1)
				IF cLast==aPhrase[y,1]
					LOOP
				ENDIF
				_VFP.CAPTION = TRANSFORM(THIS.Locale)+": "+TRANSFORM(aPhrase[y,1])
				cResult = THIS.GetString( aPhrase[y,1] )
				IF THIS.notranslation_attempt
					N=ALEN(aPhrase,1)
					EXIT
				ENDIF
				N = N + IIF(cResult==aPhrase[y,1],1,0)
			NEXT
		
			IF N=ALEN(aPhrase,1)
				*- none translated, exclude Langauge
				THIS.SQlexec( "UPDATE Locale_Lang SET Exclude=.t. where TRIM(Name)='"+THIS.Locale+"'" )
			ENDIF
		
		NEXT
		
		_VFP.CAPTION = "Microsoft Visual FoxPro"
		
		RETURN .T.
		
	ENDPROC

	HIDDEN PROCEDURE Destroy
		*------------------------------------------------------------
		* Description: Destory method
		* Parameters:  none
		* Return:      n/a
		* Use:         n/a
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 08/11/2003  Gregory L Reichert Initial Creation
		*  2 02/12/2004  GLR		Drop dependency on WSH
		*------------------------------------------------------------
		
		*--------------------------------------------
		*  clear aMenu to remove references to objects.
		*--------------------------------------------
		THIS.aMenu = ""
		
		*--------------------------------------------
		*  close Locale tables
		*--------------------------------------------
		IF THIS.SQLCONNECT >0
			SQLDISCONNECT( THIS.SQLCONNECT )
		ENDIF
		USE IN (SELECT("locale"))
		USE IN (SELECT("locale_lang"))
		USE IN (SELECT("locale_xref"))
		USE IN (SELECT("locale_source"))
		
		IF THIS.fromregistry
			*- Gregory L Reichert 02/12/2004 13:33:25 LOCALE.DESTROY : (2) : remove dependancy on WSH
			THIS.Registry( "HKEY_CURRENT_USER\Software\Locale\"+JUSTFNAME(_vfp.DefaultFilePath)+"\"+PROPER(JUSTSTEM(JUSTFNAME(SYS(16,0))))+"\Locale", THIS.Locale )
		ENDIF
		
	ENDPROC

	PROCEDURE dolabel		&& Translates and runs a Label
		*------------------------------------------------------------
		* Description: Executes a Label after transslating the Labels
		* Parameters:  <para>, <req/opt>, D=<def>, <desc>
		* Return:
		* Use:
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 02/26/2004  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		LPARAMETERS clbx, cClauses, tnSession
		
		*--------------------------------------------
		*  change to correct datasession if passed.
		*--------------------------------------------
		IF NOT EMPTY(tnSession)
			LOCAL nDS
			nDS = SET("DataSession")
			SET DATASESSION TO (tnSession)
		ENDIF
		tnDataSession = SET("DataSession")
		
		LOCAL lbxName, ls
		ls = SELECT()
		SELECT 0
		lbxName = FULLPATH(SYS(3)+".lbx")
		
		*--------------------------------------------
		*  Make a copy of the label file
		*--------------------------------------------
		USE (FORCEEXT(clbx,"lbx")) NOUPDATE
		COPY TO (lbxName)
		USE (lbxName) EXCLUSIVE ALIAS Locale_label
		
		*--------------------------------------------
		*  Translate the Labels
		*--------------------------------------------
		IF THIS.ENABLED= .T.
			LOCAL cExpr
			SCAN ALL FOR INLIST( ObjType, 5 ) AND LEFT(EXPR,1)=["] AND RIGHT(EXPR,1)=["]
				cExpr = THIS.GetString( ALLTRIM(EXPR))
				SET DATASESSION TO (tnDataSession)
				SELECT Locale_label
				REPLACE EXPR WITH m.cExpr
			ENDSCAN
			USE
		ENDIF
		
		*--------------------------------------------
		*  rename the Memo file to match the table
		*--------------------------------------------
		IF FILE(FORCEEXT(lbxName,"fpt"))
			RENAME (FORCEEXT(lbxName,"fpt")) TO (FORCEEXT(lbxName,"lbt"))
		ENDIF
		
		*--------------------------------------------
		*  Run the Label
		*--------------------------------------------
		SELECT (ls)
		LABEL FORM (lbxName) &cClauses
		
		*--------------------------------------------
		*  erase the temporary label files.
		*--------------------------------------------
		ERASE (lbxName)
		ERASE (FORCEEXT(lbxName,"lbt"))
		
		IF NOT EMPTY(tnSession)
			SET DATASESSION TO (nDS)
		ENDIF
		
		RETURN
		
	ENDPROC

	PROCEDURE doreport		&& Translated and runs a report,
		*------------------------------------------------------------
		* Description: Executes a Report after transslating the Labels
		* Parameters:  <para>, <req/opt>, D=<def>, <desc>
		* Return:
		* Use:
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 02/26/2004  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		LPARAMETERS cFRX, cClauses, tnSession
		
		*--------------------------------------------
		*  change to correct datasession if passed.
		*--------------------------------------------
		IF NOT EMPTY(tnSession)
			LOCAL nDS
			nDS = SET("DataSession")
			SET DATASESSION TO (tnSession)
		ENDIF
		tnDataSession = SET("DataSession")
		
		LOCAL frxName, ls
		ls = SELECT()
		SELECT 0
		frxName = FULLPATH(SYS(3)+".frx")
		
		*--------------------------------------------
		*  Make temporary copy of report file
		*--------------------------------------------
		USE (FORCEEXT(cFRX,"frx")) NOUPDATE
		COPY TO (frxName)
		USE (frxName) EXCLUSIVE ALIAS Locale_Report
		
		*--------------------------------------------
		*  Translate the Labels
		*--------------------------------------------
		IF THIS.ENABLED=.T.
			LOCAL cExpr
			SCAN ALL FOR INLIST( ObjType, 5 ) AND LEFT(EXPR,1)=["] AND RIGHT(EXPR,1)=["]
				cExpr = THIS.GetString( ALLTRIM(EXPR))
				SET DATASESSION TO (tnDataSession)
				SELECT Locale_Report
				REPLACE EXPR WITH m.cExpr
			ENDSCAN
			USE
		ENDIF
		
		*--------------------------------------------
		*  rename the memo file
		*--------------------------------------------
		IF FILE(FORCEEXT(frxName,"fpt"))
			RENAME (FORCEEXT(frxName,"fpt")) TO (FORCEEXT(frxName,"frt"))
		ENDIF
		
		*--------------------------------------------
		*  run report
		*--------------------------------------------
		SELECT (ls)
		REPORT FORM (frxName) &cClauses
		
		*--------------------------------------------
		*  clean up
		*--------------------------------------------
		ERASE (frxName)
		ERASE (FORCEEXT(frxName,"frt"))
		
		IF NOT EMPTY(tnSession)
			SET DATASESSION TO (nDS)
		ENDIF
		
		RETURN
		
	ENDPROC

	PROCEDURE Error
		*------------------------------------------------------------
		* Description:
		* Parameters:  <para>, <req/opt>, D=<def>, <desc>
		* Return:
		* Use:
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 02/25/2004  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		Lparameters nError, cMethod, nLine
		If _vfp.StartMode = 0
			Debug
			Suspend
		Endif
		Do Case
			Case Lower(cMethod)="callsite" And nError=1426
				Return
			Otherwise
				*		DODEFAULT( nError, cMethod, nLine )
				Error nError
		Endcase
		
	ENDPROC

	PROCEDURE getstring		&& Translate a string from the BaseLang to a specific language
		*------------------------------------------------------------
		* Description:	Looks up the phrase in the this.aLocale array.
		*				If found, the trasnslated phrase is returned,
		*				otherwise, calling the web site is performed.
		* Parameters:  	tcPhrase, req, def=, Phrase to translate.
		* Return:		String: translated phrase.
		* Use:			lcPhrase = oLocale.GetString( "This is a test" )
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 08/04/2003  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		
		LPARAMETERS tcStr
		
		*--------------------------------------------
		*  if object diabled, return original phrase
		*--------------------------------------------
		IF THIS.ENABLED= .F.
			RETURN tcStr
		ENDIF
		
		LOCAL lcStr
		lcStr = tcStr
		
		*--------------------------------------------
		*  Exception List
		*--------------------------------------------
		DO CASE
			CASE EMPTY(tcStr)
			CASE ALLTRIM(tcStr)=="\-"
			CASE ALLTRIM(tcStr)=="..."
			CASE ALLTRIM(tcStr)=="("
			OTHERWISE
		
				LOCAL lcLocale, llresult, x, isKey, isColon, lctmp, isQuoted, lcQuoteMark
				lcLocale = THIS.Locale
		
				isKey = "\<"$tcStr
				lcStr = STRTRAN(tcStr,"\<","")
				isColon = RIGHTC(ALLTRIM(tcStr),1)=":"
				isQuoted = ((LEFTC(tcStr,1)=["]) AND (RIGHTC(tcStr,1)=["])) ;
					OR ((LEFTC(tcStr,1)=[']) AND (RIGHTC(tcStr,1)=['])) ;
					OR ((LEFTC(tcStr,1)="[") AND (RIGHTC(tcStr,1)="]"))
				lcQuoteMark = IIF(isQuoted, LEFTC(tcStr,1)+RIGHTC(tcStr,1),"")
		
				*--------------------------------------------
				*  Locate base language phrase
				*--------------------------------------------
				x = THIS.ArrayLookup( lcStr, 1 )
				llresult = .F.
				IF x>0 AND LOWER(lcStr)==LOWER(THIS.aLocale[x,1])
					lcStr = ALLTRIM(THIS.aLocale[x,2])
				ELSE
					lcStr = THIS.Translate( lcStr )
					IF EMPTY(lcStr)
						lcStr = tcStr
					ENDIF
				ENDIF
		
				*--------------------------------------------
				*  preserve hotkey indicator
				*--------------------------------------------
				IF isKey
					lctmp = CHRTRANC(UPPER(lcStr), THIS.usedchar, '' )
					lctmp = CHRTRANC(lcStr, lctmp, '')
					lctmp = LEFTC(ALLTRIM(lctmp),1)
					IF NOT EMPTY(lctmp)
						THIS.usedchar = CHRTRANC(THIS.usedchar,lctmp,"")		&& remove from list
						x = ATCC(lctmp,tcStr)
						IF x>0
							lcStr = STUFFC( lcStr,x,1,"\<"+SUBSTRC(lcStr,x,1))
						ENDIF
					ENDIF
				ENDIF
		
				IF RIGHTC(ALLTRIM(lcStr),1)#":" AND isColon
					lcStr = ALLTRIM(lcStr) + ":"
				ENDIF
				IF (LEFTC(lcStr,1)#LEFTC(lcQuoteMark,1)) AND isQuoted
					lcStr = LEFTC(lcQuoteMark,1) + lcStr + RIGHTC(lcQuoteMark,1)
				ENDIF
		
		ENDCASE
		WAIT CLEAR
		RETURN lcStr
		
	ENDPROC

	PROCEDURE getwindows
		*------------------------------------------------------------
		* Description: build list of window hwnd
		* Parameters:  <para>, <req/opt>, D=<def>, <desc>
		* Return:
		* Use:
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 09/04/2003  Gregory L Reichert Initial Creation
		*  2 02/04/2004  GLR		dont clear DLL, may be needed in actual application.
		*------------------------------------------------------------
		*-- ignore popup windows
		IF NOT THIS.lclosepopup
			RETURN .T.
		ENDIF
		
		LOCAL HWND, x,N, stuffer
		
		* Get the HWND (handle) to the main FoxPro window
		#IF VERSION(5)>=700
			HWND = _VFP.HWND
		#ELSE
			IF FILE(HOME()+"FoxTools.fll")
				SET LIBRARY TO (HOME()+"FoxTools.fll") ADDITIVE
				HWND = EVALUATE("MainHWND()")
				RELEASE LIBRARY (HOME()+"FoxTools.fll")
			ELSE
				THIS.lclosepopup = .F.
				RETURN
			ENDIF
		#ENDIF
		
		* Register the Windows API functions that will be called
		DECLARE INTEGER GetWindowText IN WIN32API;
			INTEGER HWND, ;
			STRING @ lpString, ;
			INTEGER nMaxCount
		
		DECLARE INTEGER GetWindow IN user32;
			INTEGER HWND,;
			INTEGER wFlag
		
		N = 0
		DO WHILE HWND <> 0
		
			stuffer = REPLICATE(CHR(0),512)
			x = GetWindowText(HWND,@stuffer,511)
			stuffer = LEFTC(stuffer,AT_C(CHR(0),stuffer)-1)
		
			IF LEN(TRIM(stuffer)) > 0
				N = N + 1
				DIMENSION THIS.aWindows[ n, 2]
				THIS.aWindows[ n,1 ] = HWND
				THIS.aWindows[ n,2 ] = stuffer
			ENDIF
		
			HWND = GetWindow(HWND,2)
		
		ENDDO
		
		*- Gregory L Reichert 02/04/2004 06:43:23 LOCALE.GETWINDOWS : (2) : dont clear, may be needed in actual application.
		
		RETURN
		
		
	ENDPROC

	PROCEDURE Init
		*------------------------------------------------------------
		* Description: 	Initialize Object
		* Parameters:  	tcBaseLang, Opt, Def=.F., Base Language used to create form and controls.
		*				tcDestLang, Opt, Def=.F., Destination Language to be translated to.
		* Return:       N/A
		* Use:          oLocale= NewObject("Locale","Locale.vcx","","English","Spanish" )
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 08/18/2003  Gregory L Reichert Initial Creation
		*  2 2/16/2004	 GLR		Drop WebBrowser control.
		*------------------------------------------------------------
		LPARAMETERS tcBaseLang, tcDestLang
		SET SAFETY OFF
		
		ERASE ("Locale.log")
		
		*------------------------------------------------------------
		* Establish the base and locale languages.
		*------------------------------------------------------------
		IF NOT EMPTY(tcBaseLang)
			THIS.BaseLang = tcBaseLang
		ENDIF
		
		IF NOT EMPTY(tcDestLang)
			THIS.Locale = tcDestLang
		ELSE
			THIS.SETUP
		ENDIF
		
		RETURN
		
		
		*="DSN=Visual FoxPro Database;UID=;PWD=;SourceDB="+fullpath("")+"locale.dbc;SourceType=DBC;Exclusive=No;BackgroundFetch=No;Collate=Machine;Null=Yes;Deleted=Yes;"
		
		
	ENDPROC

	PROTECTED PROCEDURE loadarray		&& Loads the internal array with the current language translations.
		*------------------------------------------------------------
		* Description: 	Loads the internal trnaslated array from the Locale for the current Locale.
		* Parameters:  	none
		* Return:      	none
		* Use:         	this.LoadArray()
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 08/05/2003  Gregory L Reichert Initial Creation
		*  2 02/27/2004  GLR		Remove property DBF.
		*------------------------------------------------------------
		
		*--------------------------------------------
		*  if object diabled, return original phrase
		*--------------------------------------------
		IF THIS.ENABLED= .F.
			RETURN .T.
		ENDIF
		
		LOCAL dbLocale
		
		*- Gregory L Reichert 02/27/2004 07:52:52 LOCALE.LOADARRAY : (2) : Obsolete - not used.
		
		LOCAL fl
		fl = SELECT()
		SELECT (SELECT("locale"))
		*USE (dbLocale)
		LOCAL BASE, LANG
		BASE = THIS.BaseLang
		LANG = THIS.Locale
		
		THIS.SQlexec( "SELECT aa.phrase, bb.phrase, aa.ID FROM Locale aa "+ ;
			"INNER JOIN Locale bb "+;
			"ON aa.ID=bb.ID "+;
			"WHERE TRIM(aa.LANGUAGE)='"+m.BASE+"' "+ ;
			"AND TRIM(bb.LANGUAGE)='"+m.LANG+"' "+ ;
			"ORDER BY aa.ID ASC ", "qtemp2" )
		
		IF _TALLY>0
			LOCAL ARRAY laLocale[_tally,3]
			laLocale = ""
			SELECT * FROM qtemp2 INTO ARRAY laLocale
			DIMENSION THIS.aLocale[_tally,3]
			=ACOPY(laLocale,THIS.aLocale)
		ELSE
			DIMENSION THIS.aLocale[1,3]
			THIS.aLocale = ""
		ENDIF
		USE IN qtemp2
		USE IN (SELECT("locale"))
		SELECT (fl)
		
		RETURN
		
		
	ENDPROC

	PROTECTED PROCEDURE locale_assign
		*------------------------------------------------------------
		* Description:	Assign method to Locale.  When the property is changed, the object
		*				attempts to translate all the controls on the form to the new assigned
		*				Locale.
		* Parameters:  	n/a
		* Return:		n/a
		* Use:			internal
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 08/07/2003  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		
		LPARAMETERS vNewVal
		
		THIS.Locale = ALLTRIM(m.vNewVal)
		
		THIS.usedchar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
		
		THIS.LoadArray()
		IF this.ltranslateactiveform 
		IF TYPE("_Screen.ActiveForm")="O"
			IF TYPE("_SCREEN.ACTIVEFORM.Locale_Original")#"C"
				LOCAL PropList
				PropList = STRTRAN(THIS.property_list,[,],CHR(13)+CHR(10))
				_SCREEN.ACTIVEFORM.ADDPROPERTY("Locale_Original["+TRANSFORM(MEMLINES(m.PropList))+"]","")
			ENDIF
			LOCAL cTag
			cTag = _SCREEN.ACTIVEFORM.Locale_Original[1]
			IF EMPTY(cTag)
				STORE _SCREEN.ACTIVEFORM.CAPTION TO cTag, _SCREEN.ACTIVEFORM.Locale_Original[1]
			ENDIF
			_SCREEN.ACTIVEFORM.CAPTION = THIS.GetString( cTag )
			THIS.setLocale( _SCREEN.ACTIVEFORM )
		ENDIF
		ENDIF
		RETURN
		
	ENDPROC

	PROCEDURE ping		&& Test to see if Internet is available.
		* Program:     Ping.PRG
		* Description: Test that a internet URL is valid.
		* Developer:   Gregory L Reichert - www.GLRsoftware.com
		*------------------------------------------------------------
		* From the original work of...
		* readurl.prg 06-Mar-98
		
		* 06-Mar-98 pulled from Q174524 on March 98 Technet CD
		* 06-Mar-98 bug fixed about the length of the sReadBuffer
		
		*Any Internet or intranet URL can be passed as a parameter. Microsoft.com
		*was chosen for this example.
		
		*Note that Microsoft Internet Explorer must be installed on the computer.
		
		* passed: URLName, in the form "http://www.microsoft.com"
		* returns: the content of the URL
		* usage:
		*  uWebContent = ReadURL( "http://www.microsoft.com" )
		*  uWebContent = ReadURL( "http://www.SomeSite.com/SomeJPG.jpg" )
		* notes:
		* 1 - IE does not need to be running to use this, but must be installed,
		* as the program uses an option that gets information from the registry
		
		LPARAMETERS pcUrlName
		
		
		DECLARE INTEGER InternetOpen IN wininet STRING sAgent, ;
			INTEGER lAccessType, STRING sProxyName, ;
			STRING sProxyBypass, INTEGER lFlags
		
		DECLARE INTEGER InternetOpenUrl IN wininet ;
			INTEGER hInternetSession, STRING sUrl, STRING sHeaders,;
			INTEGER lHeadersLength, INTEGER lFlags, INTEGER lContext
		
		DECLARE INTEGER InternetReadFile IN wininet INTEGER hfile, ;
			STRING @sBuffer, INTEGER lNumberofBytesToRead, INTEGER @lBytesRead
		
		DECLARE short InternetCloseHandle IN wininet INTEGER hInst
		
		#DEFINE INTERNET_OPEN_TYPE_PRECONFIG 0
		#DEFINE INTERNET_OPEN_TYPE_DIRECT 1
		#DEFINE INTERNET_OPEN_TYPE_PROXY 3
		#DEFINE SYNCHRONOUS 0
		#DEFINE INTERNET_FLAG_RELOAD 2147483648
		#DEFINE CR CHR(13)
		
		LOCAL lsAgent, lhInternetSession, lhUrlFile, llOk, lnOk, lcReadBuffer, lnBytesRead
		
		* what application is using Internet services?
		lsAgent = "Locale"
		
		lhInternetSession = InternetOpen( lsAgent, INTERNET_OPEN_TYPE_PRECONFIG, ;
			'', '', SYNCHRONOUS)
		
		* debugging line - uncomment to see session handle
		* WAIT WINDOW "Internet session handle: " + LTRIM(STR(hInternetSession))
		
		IF lhInternetSession = 0
			*	   WAIT WINDOW "Internet session cannot be established" TIME 2
			RETURN .F.
		ENDIF
		
		lhUrlFile = InternetOpenUrl( lhInternetSession, pcUrlName, '', 0, ;
			INTERNET_FLAG_RELOAD, 0)
		
		* debugging line - uncomment to see URL handle
		* WAIT WINDOW "URL Handle: " + LTRIM(STR(hUrlFile))
		
		IF lhUrlFile = 0
			*	   WAIT WINDOW "URL cannot be opened"
			RETURN .F.
		ENDIF
		
		LOCAL lcRetVal
		lcRetVal = ""
		llOk = .T.
		
		DO WHILE llOk
			* set aside a big buffer
			LOCAL lsReadBuffer
			lsReadBuffer = SPACE(32767)
			lnBytesRead = 0
			lnOk = InternetReadFile( lhUrlFile, @lsReadBuffer, LEN(lsReadBuffer), @lnBytesRead)
		
			IF ( lnBytesRead > 0 )
				lcRetVal = lcRetVal + LEFTC( lsReadBuffer, lnBytesRead )
			ENDIF
		
			* error trap - either a read failure or read past eof()
			llOk = ( lnOk = 1 ) AND ( lnBytesRead > 0 )
		ENDDO
		
		_CLIPTEXT = lcRetVal
		
		lcRetVal = ATCC("<title>Google</title>",lcRetVal)>0
		
		* close all the handles we opened
		InternetCloseHandle( lhUrlFile )
		InternetCloseHandle( lhInternetSession )
		RETURN lcRetVal
		* Eof Ping.PRG
		
	ENDPROC

	PROCEDURE registry		&& Get and Put to the Registry
		*------------------------------------------------------------
		* Description: Get and Set values in the Registry
		* Parameters:  tAction, req, D=, Either GET or PUT
		* Return:      n/a
		* Use:         n/a
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 08/11/2003  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		
		LPARAMETERS tKey, tValue
		
		LOCAL nPara
		nPara = PARAMETERS()
		
		* Registry roots
		LOCAL HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS
		HKEY_CLASSES_ROOT           = -2147483648  && BITSET(0,31)
		HKEY_CURRENT_USER           = -2147483647  && BITSET(0,31)+1
		HKEY_LOCAL_MACHINE          = -2147483646  && BITSET(0,31)+2
		HKEY_USERS                  = -2147483645  && BITSET(0,31)+3
		
		#DEFINE REG_SZ 				1	&& Data string
		#DEFINE REG_BINARY 			3	&& Binary data in any form.
		#DEFINE REG_DWORD 			4	&& A 32-bit number.
		
		DECLARE INTEGER RegCreateKey IN Win32API ;
			INTEGER nHKey, STRING @cSubKey, INTEGER @nResult
		
		DECLARE INTEGER RegDeleteKey IN Win32API ;
			INTEGER nHKey, STRING @cSubKey
		
		DECLARE INTEGER RegOpenKey IN Win32API ;
			INTEGER nHKey, STRING @cSubKey, INTEGER @nResult
		
		DECLARE INTEGER RegCloseKey IN Win32API ;
			INTEGER nHKey
		
		DECLARE INTEGER RegQueryValueEx IN Win32API ;
			INTEGER nHKey, STRING lpszValueName, INTEGER dwReserved,;
			INTEGER @lpdwType, STRING @lpbData, INTEGER @lpcbData
		
		DECLARE INTEGER RegSetValueEx IN Win32API ;
			INTEGER hKey, STRING lpszValueName, INTEGER dwReserved,;
			INTEGER fdwType, STRING lpbData, INTEGER cbData
		
		*--------------------------------------------
		*  parse cKey
		*--------------------------------------------
		LOCAL hKey, cKey, cData
		hKey	= LEFTC( tKey, AT_C("\", tKey)-1)
		tKey 	= SUBSTRC( tKey, AT_C("\",tKey)+1)
		cKey	= LEFTC( tKey, RATC("\",tKey)-1)
		tKey 	= SUBSTRC( tKey, RATC("\",tKey)+1)
		cData	= tKey
		
		LOCAL nCurrentKey,nErrCode
		nCurrentKey = 0
		nErrCode = RegOpenKey(&hKey,cKey,@nCurrentKey)
		IF nErrCode>0
			nErrCode = RegCreateKey(&hKey,cKey,@nCurrentKey)
		ENDIF
		
		LOCAL lpdwReserved,lpdwType,lpbData,lpcbData,nErrCode, cKeyValue, nValueSize
		STORE 0 TO lpdwReserved,lpdwType
		STORE SPACE(256) TO lpbData
		STORE LEN(m.lpbData) TO m.lpcbData
		cKeyValue = ""
		
		DO CASE
			CASE nPara = 2
				* Make sure we null terminate this guy
				lpcbData = TRANSFORM(m.tValue)+CHR(0)
				nValueSize = LEN(m.lpcbData)
		
				* Set the key value here
				m.nErrCode = RegSetValueEx(nCurrentKey,m.cData,0,;
					REG_SZ,m.lpcbData ,m.nValueSize)
		
				cKeyValue = m.nErrCode=0
		
			CASE nPara = 1
		
				m.nErrCode=RegQueryValueEx(nCurrentKey,cData, m.lpdwReserved,@lpdwType,@lpbData,@lpcbData)
				m.cKeyValue = LEFTC(m.lpbData,m.lpcbData-1)
		
			OTHERWISE
				*-- do nothing
		ENDCASE
		
		=RegCloseKey(nCurrentKey)
		
		#IF VERSION(5)>600
			CLEAR DLLS RegCreateKey
			CLEAR DLLS RegDeleteKey
			CLEAR DLLS RegOpenKey
			CLEAR DLLS RegCloseKey
			CLEAR DLLS RegQueryValueEx
		#ENDIF
		
		RETURN cKeyValue
		
		
	ENDPROC

	PROCEDURE setlocale		&& Translates a object and child objects.
		*------------------------------------------------------------
		* Description: 	Scan for Caption properties, and changes them to Localized version.
		*				Child objects are recurred and change also.
		* Parameters:  	toObj, req, def=, Base object to be translated.
		* Return:		none
		* Use:			oLocale.SetLocale( Thisform )
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 07/31/2003  Gregory L Reichert Initial Creation
		*  2 03/01/2004  GLR 		Change looking for specfic object, to properties that are objects.
		*------------------------------------------------------------
		
		Lparameter toObj
		*--------------------------------------------
		*  if object diabled, return original phrase
		*--------------------------------------------
		Do Case
			Case This.Enabled= .F.
				Return
			Case Isnull(toObj)
				RETURN
			CASE TYPE('toObj.baseclass') <> 'C'
				RETURN	
		Endcase
		
		Local oObj, cText, nFore, nDFore, lcCRLF, isFirst, i,j,k
		Private cTag
		
		lcCRLF = Chr(13)+Chr(10)
		isFirst = .F.
		
		If Type("xx_marker")="U"
			*-- first time in
			isFirst = .T.
			This.ncount = 0
			Private xx_marker
			xx_marker = .T.
			This.online=.Null.			&& Test for internet connection again.  This only occurs if a translation is needed, otherwise, the translation comes from table.
		
			*------------------------------------------------------------
			* reset to help find the most optimal site for the current language.
			*------------------------------------------------------------
			If Pemstatus(toObj,"Datasession",5)
				If toObj.DataSession=2		&& Private
					Set DataSession To (toObj.DataSessionId)
				Endif
			Endif
		
			*--------------------------------------------
			*  Add start up of run, reset site to give all equal chance.
			*--------------------------------------------
			If This.resetsites
				This.SQLExec( "UPDATE Locale_source SET duration=0.001,hits=1" )
			Endif
			*--
		Endif
		
		*--------------------------------------------
		*  Initialize and translate Menus
		*--------------------------------------------
		If .F. && Lower(toObj.BaseClass) == "form"
			*--------------------------------------------
			*  if there menus in the aMenu array, process them first.
			*--------------------------------------------
			If .F.
				This.setMenu( .T.,, (toObj) )
			Endif
		Endif
		
		*--------------------------------------------
		*  if it has forecolor, highlight current control
		*--------------------------------------------
		If Between(This.translate_color, 0, Rgb(255,255,255))
			If (Pemstatus(toObj,"ForeColor",5) ;
					AND Type("toObj.ForeColor")<>"U")
		
				nFore = toObj.ForeColor
				toObj.ForeColor = This.translate_color
				loOldError = On("error")
		
			Endif
			If (Pemstatus(toObj,"DisabledForeColor",5) ;
					AND Type("toObj.DisabledForeColor")<>"U")
		
				nDFore = toObj.DisabledForeColor
				toObj.DisabledForeColor = This.translate_color
			Endif
		Endif
		
		*--------------------------------------------
		*  load Localized Captions.
		*--------------------------------------------
		Local PropList
		PropList = Strtran(This.property_list,[,],Chr(13)+Chr(10))
		If Type("toObj.Locale_Original[1]")#"C"
			toObj.AddProperty("Locale_Original["+Transform(Memlines(m.PropList))+"]","")
		Endif
		
		*- Gregory L Reichert 03/08/2004 06:37:55 LOCALE.SETLOCALE : (3) : read the properties to translate from comma delimited list.
		For i=1 To Memlines(m.PropList)
			This.Translate_Property( toObj, Mline(m.PropList,i), i)
		Next
		
		*- Gregory L Reichert 03/08/2004 06:29:01 LOCALE.SETLOCALE : (2) : Change looking for specfic object, to properties that are objects.
		Local Array aMems[1,3]
		k = Amembers( aMems, toObj, 1 )
		For j=1 To k
		
			*--------------------------------------------
			*  get next control on this container
			*--------------------------------------------
			Do Case
				Case Inlist(Lower(aMems[j,1]), "parent")
				Case Type("toObj."+aMems[j,1])#"O"
				Case Isnull(Evaluate("toObj."+aMems[j,1]))
				Otherwise
					*--------------------------------------------
					*  If the Property is  Object, check for text to translate.
					*--------------------------------------------
					oObj = Evaluate("toObj."+aMems[j,1])
		
					*--------------------------------------------
					*  Transverse to check for controls on this control.
					*--------------------------------------------
					*- Gregory L Reichert 01/30/2004 07:21:06 LOCALE.SETLOCALE : (1) : Include other object collections  (by  Bhavbhuti Nathwani, Venus Software Operatcions )
					*- Gregory L Reichert 02/03/2004 06:34:25 LOCALE.SETLOCALE : (2) : Restructured to be both compatible with 6.0 with no Objects collection with other collections, and 8.0 both sets of collections.
					*- Gregory L Reichert 02/11/2004 09:18:20 LOCALE.SETLOCALE : (3) : do not recurs if the object is the same as main object and not first time in this method.
					If Not (Vartype(oObj)="O" And Compobj( oObj, toObj ) And Not isFirst)
						This.setLocale( oObj )
					Endif
		
			Endcase
		Next
		
		
		*--------------------------------------------
		*  reset forecolor to original
		*--------------------------------------------
		If Between(This.translate_color, 0, Rgb(255,255,255))
			If (Pemstatus(toObj,"ForeColor",5) ;
					AND Type("toObj.ForeColor")<>"U")
		
				toObj.ForeColor = nFore
			Endif
			If (Pemstatus(toObj,"DisabledForeColor",5) ;
					AND Type("toObj.DisabledForeColor")<>"U")
		
				toObj.DisabledForeColor = nDFore
			Endif
		Endif
		
		If isFirst
			*--------------------------------------------
			*  clean up if this recurs is the first level
			*--------------------------------------------
			Use In (Select("qSites"))
			Use In (Select("qSites0"))
			Use In (Select("Locale_Source"))
			Use In (Select("Locale_xref"))
			Use In (Select("Locale_Lang"))
		
			*-- refresh the entire object.
		*!*	modificare ROAGEST v 2.0.105
		*!*		toObj.Refresh
		*!*	modificare ROAGEST v 2.0.105	^
			Wait Clear
		Endif
		
		Return
		
	ENDPROC

	PROCEDURE setmenu		&& Runs and translates captions on menu.
		*------------------------------------------------------------
		* Description: Register and execute MPR code.
		* Parameters:  cMenuName, Filename and extension of MPR file.
		*			   cMenuType,
		* Return:
		* Use:         oLocale.SetMenu( "MyMenu.mpr","formmenu",thisform )
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 02/16/2004  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		
		LPARAMETERS cMenuName, cMenuType, othisform
		
		
		IF TYPE("cMenuName")="L"
			IF TYPE("this.aMenu[1,1]")#"L"
				LOCAL i
				FOR i=1 TO ALEN(THIS.aMenu,1)
					DO CASE
						CASE LOWER(THIS.aMenu[i,2])="menu"
							DO (THIS.aMenu[i,1])
						CASE LOWER(THIS.aMenu[i,2])="formmenu" AND (not ISNULL(THIS.aMenu[i,3])) AND COMPOBJ(THIS.aMenu[i,3],othisform)
							KEYBOARD "{Enter}" CLEAR PLAIN
							THIS.aMenu[i,3].ZORDER(0)
							DO (THIS.aMenu[i,1]) WITH THIS.aMenu[i,3], .T.
							CLEAR TYPEAHEAD
						CASE LOWER(THIS.aMenu[i,2])="shortcut" && AND COMPOBJ(THIS.aMenu[i,3],othisform)
							THIS.aMenu[i,3].ZORDER(0)
							DO (THIS.aMenu[i,1])
					ENDCASE
				NEXT
			ENDIF
		ELSE
			IF TYPE("this.aMenu[1,1]")#"L"
				DIMENSION THIS.aMenu[ ALEN(this.aMenu,1)+1, 3]
			ENDIF
			THIS.aMenu[ALEN(this.aMenu,1),1] = cMenuName
			THIS.aMenu[ALEN(this.aMenu,1),2] = cMenuType
			THIS.aMenu[ALEN(this.aMenu,1),3] = othisform
		
			DO CASE
				CASE LOWER(cMenuType)="menu"
					DO (cMenuName)
				CASE LOWER(cMenuType)="formmenu"
					KEYBOARD "{Enter}" CLEAR PLAIN
					othisform.ZORDER(0)
					DO (cMenuName) WITH othisform, .T.
					CLEAR TYPEAHEAD
				CASE LOWER(cMenuType)="shortcut"
					DO (cMenuName)
			ENDCASE
		ENDIF
		
		RETURN
		
	ENDPROC

	PROTECTED PROCEDURE setup
		*------------------------------------------------------------
		* Description:	Attempt to determine the Locale of the VFP version, User OS setting, or default OS setting.
		* Parameters:  	none
		* Return:		none
		* Use:			this.Setup
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 08/04/2003  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		
		LOCAL ow, lcLocale, lnLocale, cPath
		
		lcLocale = []
		
		*--------------------------------------------
		*  try registry
		*--------------------------------------------
		IF THIS.fromregistry
			*- Gregory L Reichert 02/12/2004 13:31:22 LOCALE.SETUP : (1) : drop dependancy on WSH
			lcLocale = THIS.Registry( "HKEY_CURRENT_USER\Software\Locale\"+JUSTFNAME(_vfp.DefaultFilePath)+"\"+PROPER(JUSTSTEM(JUSTFNAME(SYS(16,0))))+"\Locale" )
		ENDIF
		
		IF EMPTY(lcLocale)
		
			*--------------------------------------------
			*  Try Foxpro level
			*--------------------------------------------
			lcLocale = IIF(VERSION(3)='00','English', lcLocale)
			lcLocale = IIF(VERSION(3)='07','Russian', lcLocale)
			lcLocale = IIF(VERSION(3)='33','French', lcLocale)
			lcLocale = IIF(VERSION(3)='34','Spanish', lcLocale)
			lcLocale = IIF(VERSION(3)='39','Italian', lcLocale)
			lcLocale = IIF(VERSION(3)='48','Polish', lcLocale)
			lcLocale = IIF(VERSION(3)='49','German', lcLocale)
			lcLocale = IIF(VERSION(3)='55','Portuguese', lcLocale)
			lcLocale = IIF(VERSION(3)='42','Czech', lcLocale)
			lcLocale = IIF(VERSION(3)='82','Korean', lcLocale)
			lcLocale = IIF(VERSION(3)='86','Simplified_Chinese', lcLocale)
			lcLocale = IIF(VERSION(3)='88','Traditional_Chinese', lcLocale)
		
			IF EMPTY(lcLocale)
		
				*-- default English
				lcLocale = "Romana"
		
				*--------------------------------------------
				*  User Level
				*--------------------------------------------
				DECLARE SHORT GetUserDefaultLangID IN kernel32
				lnLocale = GetUserDefaultLangID()
				*- Gregory L Reichert 02/09/2004 07:02:23 LOCALE.SETUP : (1) : remove CLEAR DLLS,  in VFP 6.0, it clears all DLLS.  (suggested by: Bhavbhuti Nathwani )
		
				IF lnLocale # 0x0800
					*lcLocale = IIF(lnLocale=0x0000 ,"Neutral",lcLocale)
					*lcLocale = IIF(lnLocale=0x007f ,"The language for the invariant locale (LOCALE_INVARIANT). See MAKELCID.",lcLocale)
					*lcLocale = IIF(lnLocale=0x0400 ,"Process or User Default Language",lcLocale)
					*lcLocale = IIF(lnLocale=0x0800 ,"System Default Language",lcLocale)
					*lcLocale = IIF(lnLocale=0x0436 ,"Afrikaans",lcLocale)
					*lcLocale = IIF(lnLocale=0x041c ,"Albanian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0401 ,"Arabic",lcLocale)			&& (Saudi Arabia)
					*lcLocale = IIF(lnLocale=0x0801 ,"Arabic",lcLocale)			&& (Iraq)
					*lcLocale = IIF(lnLocale=0x0c01 ,"Arabic",lcLocale)			&& (Egypt)
					*lcLocale = IIF(lnLocale=0x1001 ,"Arabic",lcLocale)			&& (Libya)
					*lcLocale = IIF(lnLocale=0x1401 ,"Arabic",lcLocale)			&& (Algeria)
					*lcLocale = IIF(lnLocale=0x1801 ,"Arabic",lcLocale)			&& (Morocco)
					*lcLocale = IIF(lnLocale=0x1c01 ,"Arabic",lcLocale)			&& (Tunisia)
					*lcLocale = IIF(lnLocale=0x2001 ,"Arabic",lcLocale)			&& (Oman)
					*lcLocale = IIF(lnLocale=0x2401 ,"Arabic",lcLocale)			&& (Yemen)
					*lcLocale = IIF(lnLocale=0x2801 ,"Arabic",lcLocale)			&& (Syria)
					*lcLocale = IIF(lnLocale=0x2c01 ,"Arabic",lcLocale)			&& (Jordan)
					*lcLocale = IIF(lnLocale=0x3001 ,"Arabic",lcLocale)			&& (Lebanon)
					*lcLocale = IIF(lnLocale=0x3401 ,"Arabic",lcLocale)			&& (Kuwait)
					*lcLocale = IIF(lnLocale=0x3801 ,"Arabic",lcLocale)			&& (U.A.E.)
					*lcLocale = IIF(lnLocale=0x3c01 ,"Arabic",lcLocale)			&& (Bahrain)
					*lcLocale = IIF(lnLocale=0x4001 ,"Arabic",lcLocale)			&& (Qatar)
					*lcLocale = IIF(lnLocale=0x042b ,"Armenian",lcLocale)
					*lcLocale = IIF(lnLocale=0x042c ,"Azeri",lcLocale)			&& (Latin)
					*lcLocale = IIF(lnLocale=0x082c ,"Azeri",lcLocale)			&& (Cyrillic)
					*lcLocale = IIF(lnLocale=0x042d ,"Basque",lcLocale)
					*lcLocale = IIF(lnLocale=0x0423 ,"Belarusian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0402 ,"Bulgarian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0455 ,"Burmese",lcLocale)
					*lcLocale = IIF(lnLocale=0x0403 ,"Catalan",lcLocale)
					*lcLocale = IIF(lnLocale=0x0404 ,"Chinese",lcLocale)			&& (Taiwan)
					*lcLocale = IIF(lnLocale=0x0804 ,"Chinese",lcLocale)			&& (PRC)
					*lcLocale = IIF(lnLocale=0x0c04 ,"Chinese",lcLocale)			&& (Hong Kong SAR, PRC)
					*lcLocale = IIF(lnLocale=0x1004 ,"Chinese",lcLocale)			&& (Singapore)
					*lcLocale = IIF(lnLocale=0x1404 ,"Chinese",lcLocale)			&& (Macau SAR)
					*lcLocale = IIF(lnLocale=0x041a ,"Croatian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0405 ,"Czech",lcLocale)
					*lcLocale = IIF(lnLocale=0x0406 ,"Danish",lcLocale)
					*lcLocale = IIF(lnLocale=0x0465 ,"Divehi",lcLocale)
					lcLocale = IIF(lnLocale=0x0413 ,"Dutch",lcLocale)			&& (Netherlands)
					lcLocale = IIF(lnLocale=0x0813 ,"Dutch",lcLocale)			&& (Belgium)
					lcLocale = IIF(lnLocale=0x0409 ,"English",lcLocale)			&& (United States)
					lcLocale = IIF(lnLocale=0x0809 ,"English",lcLocale)			&& (United Kingdom)
					lcLocale = IIF(lnLocale=0x0c09 ,"English",lcLocale)			&& (Australian)
					lcLocale = IIF(lnLocale=0x1009 ,"English",lcLocale)			&& (Canadian)
					lcLocale = IIF(lnLocale=0x1409 ,"English",lcLocale)			&& (New Zealand)
					lcLocale = IIF(lnLocale=0x1809 ,"English",lcLocale)			&& (Ireland)
					lcLocale = IIF(lnLocale=0x1c09 ,"English",lcLocale)			&& (South Africa)
					lcLocale = IIF(lnLocale=0x2009 ,"English",lcLocale)			&& (Jamaica)
					lcLocale = IIF(lnLocale=0x2409 ,"English",lcLocale)			&& (Caribbean)
					lcLocale = IIF(lnLocale=0x2809 ,"English",lcLocale)			&& (Belize)
					lcLocale = IIF(lnLocale=0x2c09 ,"English",lcLocale)			&& (Trinidad)
					lcLocale = IIF(lnLocale=0x3009 ,"English",lcLocale)			&& (Zimbabwe)
					lcLocale = IIF(lnLocale=0x3409 ,"English",lcLocale)			&& (Philippines)
					*lcLocale = IIF(lnLocale=0x0425 ,"Estonian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0438 ,"Faeroese",lcLocale)
					*lcLocale = IIF(lnLocale=0x0429 ,"Farsi",lcLocale)
					*lcLocale = IIF(lnLocale=0x040b ,"Finnish",lcLocale)
					lcLocale = IIF(lnLocale=0x040c ,"French",lcLocale)			&& (Standard)
					lcLocale = IIF(lnLocale=0x080c ,"French",lcLocale)			&& (Belgian)
					lcLocale = IIF(lnLocale=0x0c0c ,"French",lcLocale)			&& (Canadian)
					lcLocale = IIF(lnLocale=0x100c ,"French",lcLocale)			&& (Switzerland)
					lcLocale = IIF(lnLocale=0x140c ,"French",lcLocale)			&& (Luxembourg)
					lcLocale = IIF(lnLocale=0x180c ,"French",lcLocale)			&& (Monaco)
					*lcLocale = IIF(lnLocale=0x0456 ,"Galician",lcLocale)
					*lcLocale = IIF(lnLocale=0x0437 ,"Georgian",lcLocale)
					lcLocale = IIF(lnLocale=0x0407 ,"German",lcLocale)			&& (Standard)
					lcLocale = IIF(lnLocale=0x0807 ,"German",lcLocale)			&& (Switzerland)
					lcLocale = IIF(lnLocale=0x0c07 ,"German",lcLocale)			&& (Austria)
					lcLocale = IIF(lnLocale=0x1007 ,"German",lcLocale)			&& (Luxembourg)
					lcLocale = IIF(lnLocale=0x1407 ,"German",lcLocale)			&& (Liechtenstein)
					*lcLocale = IIF(lnLocale=0x0408 ,"Greek",lcLocale)
					*lcLocale = IIF(lnLocale=0x0447 ,"Gujaratci",lcLocale)
					*lcLocale = IIF(lnLocale=0x040d ,"Hebrew",lcLocale)
					*lcLocale = IIF(lnLocale=0x0439 ,"Hindi",lcLocale)
					*lcLocale = IIF(lnLocale=0x040e ,"Hungarian",lcLocale)
					*lcLocale = IIF(lnLocale=0x040f ,"Icelandic",lcLocale)
					*lcLocale = IIF(lnLocale=0x0421 ,"Indonesian",lcLocale)
					lcLocale = IIF(lnLocale=0x0410 ,"Italian",lcLocale)			&& (Standard)
					lcLocale = IIF(lnLocale=0x0810 ,"Italian",lcLocale)			&& (Switzerland)
					*lcLocale = IIF(lnLocale=0x0411 ,"Japanese",lcLocale)
					*lcLocale = IIF(lnLocale=0x044b ,"Kannada",lcLocale)
					*lcLocale = IIF(lnLocale=0x0457 ,"Konkani",lcLocale)
					*lcLocale = IIF(lnLocale=0x0412 ,"Korean",lcLocale)
					*lcLocale = IIF(lnLocale=0x0812 ,"Korean",lcLocale)			&& (Johab)
					*lcLocale = IIF(lnLocale=0x0440 ,"Kyrgyz",lcLocale)
					*lcLocale = IIF(lnLocale=0x0426 ,"Latvian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0427 ,"Lithuanian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0827 ,"Lithuanian",lcLocale)			&& (Classic)
					*lcLocale = IIF(lnLocale=0x042f ,"FYRO Macedonian",lcLocale)
					*lcLocale = IIF(lnLocale=0x043e ,"Malay",lcLocale)			&& (Malaysian)
					*lcLocale = IIF(lnLocale=0x083e ,"Malay",lcLocale)			&& (Brunei Darussalam)
					*lcLocale = IIF(lnLocale=0x044e ,"Maratchi",lcLocale)
					*lcLocale = IIF(lnLocale=0x0450 ,"Mongolian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0414 ,"Norwegian",lcLocale)			&& (Bokmal)
					*lcLocale = IIF(lnLocale=0x0814 ,"Norwegian",lcLocale)			&& (Nynorsk)
					*lcLocale = IIF(lnLocale=0x0415 ,"Polish",lcLocale)
					lcLocale = IIF(lnLocale=0x0416 ,"Portuguese",lcLocale)			&& (Brazil)
					lcLocale = IIF(lnLocale=0x0816 ,"Portuguese",lcLocale)			&& (Portugal)
					*lcLocale = IIF(lnLocale=0x0446 ,"Punjabi",lcLocale)
					lcLocale = IIF(lnLocale=0x0418 ,"Romana",lcLocale)
					lcLocale = IIF(lnLocale=0x0419 ,"Russian",lcLocale)
					*lcLocale = IIF(lnLocale=0x044f ,"Sanskrit",lcLocale)
					*lcLocale = IIF(lnLocale=0x0c1a ,"Serbian",lcLocale)			&& (Cyrillic)
					*lcLocale = IIF(lnLocale=0x081a ,"Serbian",lcLocale)			&& (Latin)
					*lcLocale = IIF(lnLocale=0x041b ,"Slovak",lcLocale)
					*lcLocale = IIF(lnLocale=0x0424 ,"Slovenian",lcLocale)
					lcLocale = IIF(lnLocale=0x040a ,"Spanish",lcLocale)			&& (Spain, Traditional Sort)
					lcLocale = IIF(lnLocale=0x080a ,"Spanish",lcLocale)			&& (Mexican)
					lcLocale = IIF(lnLocale=0x0c0a ,"Spanish",lcLocale)			&& (Spain, Modern Sort)
					lcLocale = IIF(lnLocale=0x100a ,"Spanish",lcLocale)			&& (Guatemala)
					lcLocale = IIF(lnLocale=0x140a ,"Spanish",lcLocale)			&& (Costa Rica)
					lcLocale = IIF(lnLocale=0x180a ,"Spanish",lcLocale)			&& (Panama)
					lcLocale = IIF(lnLocale=0x1c0a ,"Spanish",lcLocale)			&& (Dominican Republic)
					lcLocale = IIF(lnLocale=0x200a ,"Spanish",lcLocale)			&& (Venezuela)
					lcLocale = IIF(lnLocale=0x240a ,"Spanish",lcLocale)			&& (Colombia)
					lcLocale = IIF(lnLocale=0x280a ,"Spanish",lcLocale)			&& (Peru)
					lcLocale = IIF(lnLocale=0x2c0a ,"Spanish",lcLocale)			&& (Argentina)
					lcLocale = IIF(lnLocale=0x300a ,"Spanish",lcLocale)			&& (Ecuador)
					lcLocale = IIF(lnLocale=0x340a ,"Spanish",lcLocale)			&& (Chile)
					lcLocale = IIF(lnLocale=0x380a ,"Spanish",lcLocale)			&& (Uruguay)
					lcLocale = IIF(lnLocale=0x3c0a ,"Spanish",lcLocale)			&& (Paraguay)
					lcLocale = IIF(lnLocale=0x400a ,"Spanish",lcLocale)			&& (Bolivia)
					lcLocale = IIF(lnLocale=0x440a ,"Spanish",lcLocale)			&& (El Salvador)
					lcLocale = IIF(lnLocale=0x480a ,"Spanish",lcLocale)			&& (Honduras)
					lcLocale = IIF(lnLocale=0x4c0a ,"Spanish",lcLocale)			&& (Nicaragua)
					lcLocale = IIF(lnLocale=0x500a ,"Spanish",lcLocale)			&& (Puerto Rico)
					*lcLocale = IIF(lnLocale=0x0430 ,"Sutu",lcLocale)
					*lcLocale = IIF(lnLocale=0x0441 ,"Swahili",lcLocale)			&& (Kenya)
					*lcLocale = IIF(lnLocale=0x041d ,"Swedish",lcLocale)
					*lcLocale = IIF(lnLocale=0x081d ,"Swedish",lcLocale)			&& (Finland)
					*lcLocale = IIF(lnLocale=0x045a ,"Syriac",lcLocale)
					*lcLocale = IIF(lnLocale=0x0449 ,"Tamil",lcLocale)
					*lcLocale = IIF(lnLocale=0x0444 ,"Tatar",lcLocale)			&& (Tatarstan)
					*lcLocale = IIF(lnLocale=0x044a ,"Telugu",lcLocale)
					*lcLocale = IIF(lnLocale=0x041e ,"Thai",lcLocale)
					*lcLocale = IIF(lnLocale=0x041f ,"Turkish",lcLocale)
					*lcLocale = IIF(lnLocale=0x0422 ,"Ukrainian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0420 ,"Urdu",lcLocale)			&& (Pakistan)
					*lcLocale = IIF(lnLocale=0x0820 ,"Urdu",lcLocale)			&& (India)
					*lcLocale = IIF(lnLocale=0x0443 ,"Uzbek",lcLocale)			&& (Latin)
					*lcLocale = IIF(lnLocale=0x0843 ,"Uzbek",lcLocale)			&& (Cyrillic)
					*lcLocale = IIF(lnLocale=0x042a ,"Vietnamese",lcLocale)
				ELSE
					*--------------------------------------------
					*  System Level
					*--------------------------------------------
					* - get from System Default
					DECLARE INTEGER GetSystemDefaultLangID IN kernel32
					lnLocale = BITAND( GetSystemDefaultLangID(),0x1FF)
					*- Gregory L Reichert 02/09/2004 07:02:43 LOCALE.SETUP : (1) : remove CLEAR DLLS,  in VFP 6.0, it clears all DLLS.  (suggested by: Bhavbhuti Nathwani )
		
					*lcLocale = IIF(lnLocale=0x00 ,"Neutral", lcLocale )
					*lcLocale = IIF(lnLocale=0x01 ,"Arabic", lcLocale )
					*lcLocale = IIF(lnLocale=0x02 ,"Bulgarian", lcLocale )
					*lcLocale = IIF(lnLocale=0x03 ,"Catalan", lcLocale )
					*lcLocale = IIF(lnLocale=0x04 ,"Chinese", lcLocale )
					*lcLocale = IIF(lnLocale=0x05 ,"Czech", lcLocale )
					lcLocale = IIF(lnLocale=0x06 ,"Danish", lcLocale )
					lcLocale = IIF(lnLocale=0x07 ,"German", lcLocale )
					lcLocale = IIF(lnLocale=0x08 ,"Greek", lcLocale )
					lcLocale = IIF(lnLocale=0x09 ,"English", lcLocale )
					lcLocale = IIF(lnLocale=0x0a ,"Spanish", lcLocale )
					*lcLocale = IIF(lnLocale=0x0b ,"Finnish", lcLocale )
					lcLocale = IIF(lnLocale=0x0c ,"French", lcLocale )
					*lcLocale = IIF(lnLocale=0x0d ,"Hebrew", lcLocale )
					*lcLocale = IIF(lnLocale=0x0e ,"Hungarian", lcLocale )
					*lcLocale = IIF(lnLocale=0x0f ,"Icelandic", lcLocale )
					lcLocale = IIF(lnLocale=0x10 ,"Italian", lcLocale )
					*lcLocale = IIF(lnLocale=0x11 ,"Japanese", lcLocale )
					*lcLocale = IIF(lnLocale=0x12 ,"Korean", lcLocale )
					lcLocale = IIF(lnLocale=0x13 ,"Dutch", lcLocale )
					lcLocale = IIF(lnLocale=0x14 ,"Norwegian", lcLocale )
					*lcLocale = IIF(lnLocale=0x15 ,"Polish", lcLocale )
					lcLocale = IIF(lnLocale=0x16 ,"Portuguese", lcLocale )
					lcLocale = IIF(lnLocale=0x18 ,"Romana", lcLocale )
					lcLocale = IIF(lnLocale=0x19 ,"Russian", lcLocale )
					*lcLocale = IIF(lnLocale=0x1a ,"Croatian", lcLocale )
					*lcLocale = IIF(lnLocale=0x1a ,"Serbian", lcLocale )
					*lcLocale = IIF(lnLocale=0x1b ,"Slovak", lcLocale )
					*lcLocale = IIF(lnLocale=0x1c ,"Albanian", lcLocale )
					*lcLocale = IIF(lnLocale=0x1d ,"Swedish", lcLocale )
					*lcLocale = IIF(lnLocale=0x1e ,"Thai", lcLocale )
					*lcLocale = IIF(lnLocale=0x1f ,"Turkish", lcLocale )
					*lcLocale = IIF(lnLocale=0x20 ,"Urdu", lcLocale )
					*lcLocale = IIF(lnLocale=0x21 ,"Indonesian", lcLocale )
					*lcLocale = IIF(lnLocale=0x22 ,"Ukrainian", lcLocale )
					*lcLocale = IIF(lnLocale=0x23 ,"Belarusian", lcLocale )
					*lcLocale = IIF(lnLocale=0x24 ,"Slovenian", lcLocale )
					*lcLocale = IIF(lnLocale=0x25 ,"Estonian", lcLocale )
					*lcLocale = IIF(lnLocale=0x26 ,"Latvian", lcLocale )
					*lcLocale = IIF(lnLocale=0x27 ,"Lithuanian", lcLocale )
					*lcLocale = IIF(lnLocale=0x29 ,"Farsi", lcLocale )
					*lcLocale = IIF(lnLocale=0x2a ,"Vietnamese", lcLocale )
					*lcLocale = IIF(lnLocale=0x2b ,"Armenian", lcLocale )
					*lcLocale = IIF(lnLocale=0x2c ,"Azeri", lcLocale )
					*lcLocale = IIF(lnLocale=0x2d ,"Basque", lcLocale )
					*lcLocale = IIF(lnLocale=0x2f ,"FYRO Macedonian", lcLocale )
					*lcLocale = IIF(lnLocale=0x36 ,"Afrikaans", lcLocale )
					*lcLocale = IIF(lnLocale=0x37 ,"Georgian", lcLocale )
					*lcLocale = IIF(lnLocale=0x38 ,"Faeroese", lcLocale )
					*lcLocale = IIF(lnLocale=0x39 ,"Hindi", lcLocale )
					*lcLocale = IIF(lnLocale=0x3e ,"Malay", lcLocale )
					*lcLocale = IIF(lnLocale=0x3f ,"Kazak", lcLocale )
					*lcLocale = IIF(lnLocale=0x40 ,"Kyrgyz", lcLocale )
					*lcLocale = IIF(lnLocale=0x41 ,"Swahili", lcLocale )
					*lcLocale = IIF(lnLocale=0x43 ,"Uzbek", lcLocale )
					*lcLocale = IIF(lnLocale=0x44 ,"Tatar", lcLocale )
					*lcLocale = IIF(lnLocale=0x46 ,"Punjabi", lcLocale )
					*lcLocale = IIF(lnLocale=0x47 ,"Gujaratci", lcLocale )
					*lcLocale = IIF(lnLocale=0x49 ,"Tamil", lcLocale )
					*lcLocale = IIF(lnLocale=0x4a ,"Telugu", lcLocale )
					*lcLocale = IIF(lnLocale=0x4b ,"Kannada", lcLocale )
					*lcLocale = IIF(lnLocale=0x4e ,"Maratchi", lcLocale )
					*lcLocale = IIF(lnLocale=0x4f ,"Sanskrit", lcLocale )
					*lcLocale = IIF(lnLocale=0x50 ,"Mongolian", lcLocale )
					*lcLocale = IIF(lnLocale=0x56 ,"Galician", lcLocale )
					*lcLocale = IIF(lnLocale=0x57 ,"Konkani", lcLocale )
					*lcLocale = IIF(lnLocale=0x5a ,"Syriac", lcLocale )
					*lcLocale = IIF(lnLocale=0x65 ,"Divehi", lcLocale )
		
				ENDIF
			ENDIF
		ENDIF
		THIS.Locale = lcLocale
		
		RETURN
		
		
	ENDPROC

	PROCEDURE sqlexec		&& Executes SQL statement either locally or remotely.
		*------------------------------------------------------------
		* Description:
		* Parameters:  <para>, <req/opt>, D=<def>, <desc>
		* Return:
		* Use:
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 02/17/2004  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		LPARAMETERS tcSQL, tcCursor, tnSession
		Local llUsed, lcLocaleDb
		llUsed = .F.
		*--------------------------------------------
		*  change to correct datasession if passed.
		*--------------------------------------------
		IF NOT EMPTY(tnSession)
			LOCAL nDS
			nDS = SET("DataSession")
			SET DATASESSION TO (tnSession)
		ENDIF
		If Dbused('locale')
			llUsed = .T.
		Else
			lcLocaleDb = gcLocalePath + "locale.dbc"
			Open Database (m.lcLocaleDb)
		Endif
		LOCAL fl, crlf
		crlf = CHR(13)+CHR(10)
		fl = SELECT()
		SELECT (SELECT("qtemp"))
		IF THIS.SQLCONNECT<=0 AND NOT EMPTY(THIS.sqlconnectionstring)
			THIS.SQLCONNECT = SQLSTRINGCONNECT( THIS.sqlconnectionstring )
			IF THIS.SQLCONNECT<=0
				*--------------------------------------------
				*  If connecting to Driver fails, attempt to proceed with
				*  direct FOX statements for remainder of the life of the Locale object
				*--------------------------------------------
				THIS.sqlconnectionstring = ""
			ENDIF
		ENDIF
		
		LOCAL lcDel, lcExact
		lcDel = SET("Deleted")
		lcExact = SET("Exact")
		SET DELETED ON 				&& always ignore all deleted record if table is VFP based.
		SET EXACT ON
		
		DO CASE
			CASE EMPTY( THIS.sqlconnectionstring ) AND EMPTY( tcCursor )
				&tcSQL
			CASE EMPTY( THIS.sqlconnectionstring ) AND NOT EMPTY( tcCursor )
				&tcSQL INTO CURSOR &tcCursor
			CASE NOT EMPTY( THIS.sqlconnectionstring ) AND EMPTY( tcCursor )
				lnResult =	SQlexec(THIS.SQLCONNECT, tcSQL)
			CASE NOT EMPTY( THIS.sqlconnectionstring ) AND NOT EMPTY( tcCursor )
				lnResult = SQlexec( THIS.SQLCONNECT, tcSQL , tcCursor )
		ENDCASE
		
		SET DELETED &lcDel
		SET EXACT &lcExact
		
		LOCAL ARRAY aEr[1]
		IF ERROR()<>0
			=AERROR(aEr)
			WAIT WINDOW aEr[2] NOWAIT NOCLEAR
			ERROR aEr[1]
			WAIT CLEAR
		ENDIF
		
		IF THIS.SQLCONNECT>-1
			SQLDISCONNECT( THIS.SQLCONNECT )
			THIS.SQLCONNECT = -1
		ENDIF
		
		SELECT (fl)
		IF NOT EMPTY(tnSession)
			SET DATASESSION TO (nDS)
		ENDIF
		If !llUsed And Dbused('locale')
			Close Databases
		Endif
		RETURN .T.
		
	ENDPROC

	PROCEDURE translate		&& Translate a phrase to a different language
		*------------------------------------------------------------
		* Description: 	Translate phrase using Web Site.  Generally this method is not called
		*				by outside rotuines, and is used internal when prior translation is
		*				not found in the aLocale array.  if not found, the web site called to
		*				obtain the translation.
		* Parameters:  	tcPhrase, req, def=, Phrase to be translated.
		*				tcLanguage, opt, def=this.Locale, Language to translate to.
		* Return:		String: Translated phrase, or original if unable to translate.
		* Use:			lcPhrase = oLocale.Translate( "This is a test" )
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 08/04/2003  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		LPARAMETERS tcPhrase
		
		*--------------------------------------------
		*  if object diabled, return original phrase
		*--------------------------------------------
		IF THIS.ENABLED= .F.
			RETURN tcPhrase
		ENDIF
		
		LOCAL cHTML,lcTranslated, x, lp, o, F, i, crlf
		crlf = CHR(13)+CHR(10)
		
		*- Gregory L Reichert 02/09/2004 07:18:16 LOCALE.TRANSLATE : (2) : Moved to CallSite.
		
		*--------------------------------------------
		*  Array columns in aLocale
		*--------------------------------------------
		#DEFINE kSource 		1
		#DEFINE kDestination 	2
		#DEFINE	kID				3
		
		*--------------------------------------------
		*  if tcLanguage missing, use .Locale
		*--------------------------------------------
		
		THIS.Locale = ALLTRIM(THIS.Locale)
		
		IF NOT THIS.quite
			THIS.ncount = THIS.ncount + 1
		ENDIF
		*--------------------------------------------
		*  try google first.
		*--------------------------------------------
		lcTranslated=tcPhrase
		
		x = THIS.ArrayLookup( tcPhrase, kDestination)
		IF x>0
			*-- already translated.
			RETURN tcPhrase
		ENDIF
		
		LOCAL nAll
		FOR nAll = 1 TO THIS.nallsitesattempt
		
		
			*--------------------------------------------
			*  call the sites and translate
			*--------------------------------------------
			IF THIS.BaseLang == THIS.Locale
				lcTranslated = tcPhrase
			ELSE
			IF This.Searchinternet 
					lcTranslated = THIS.CallSite( tcPhrase )
				ENDIF 
			ENDIF
		
			*--------------------------------------------
			*  did it translate?
			*--------------------------------------------
			DO CASE
				CASE lcTranslated == THIS.lasttranslation AND tcPhrase # THIS.lastphrase
					LOOP
				CASE EMPTY(lcTranslated)
					lcTranslated = tcPhrase
				CASE OCCURS("??",lcTranslated)>0			&& unable to tranlate
					lcTranslated = tcPhrase
				OTHERWISE
		
					*--------------------------------------------
					*  for debug: log trnalation
					*--------------------------------------------
		*!*	modificare ROAGEST v 2.0.105
		*!*				STRTOFILE( THIS.Locale+ ": " + tcPhrase + " => " + lcTranslated + CHR(13)+CHR(10), "Locale.log",.T.)
		*!*	modificare ROAGEST v 2.0.105	^
		
					LOCAL fl, lnID
					fl = SELECT()
					SELECT (SELECT("qtemp"))
		
					*--------------------------------------------
					*  Insert into Locale
					*--------------------------------------------
					*- find original phrases
					tcPhrase = STRTRAN(STRTRAN(tcPhrase,crlf,"/r"),['],["])
					THIS.SQlexec( "SELECT ID FROM Locale" ;
						+" WHERE TRIM(Phrase)='" + tcPhrase + "'" ;
						+" AND TRIM(LANGUAGE)='"+THIS.BaseLang+"'" ;
						+" and LEN(Phrase)=LEN('"+tcPhrase+"') " ;
						+IIF(ATC("foxpro",THIS.sqlconnectionstring)>0 OR EMPTY(THIS.sqlconnectionstring)," AND NOT DELETED()","") ;
						, "qtemp" )
		
					IF EOF("qtemp")			&& not found, add
						*- find highest ID number
						THIS.SQlexec( "SELECT ID FROM Locale" ;
							+" WHERE TRIM(LANGUAGE)='"+THIS.BaseLang+"'" ;
							+" ORDER BY 1 DESC " ;
							, "qtemp" )
						IF EOF("qtemp" )
							lnID = 1
						ELSE
							*- increment
							lnID = VAL(TRANSFORM(qtemp.ID))+1
						ENDIF
						*- add original phrase
						IF this.llocale 
						  THIS.SQlexec( "INSERT INTO Locale (Phrase,LANGUAGE,Notes,ID) VALUES ( STRTRAN('"+tcPhrase+"','/r',crlf),'"+ THIS.BaseLang+"','',"+TRANSFORM(lnID)+" )")
						*--------------------------------------------
						*  update internal array
						*--------------------------------------------
						  THIS.LoadArray()
		                ENDIF    
					ELSE
						lnID = qtemp.ID
					ENDIF
		
					*- Gregory L Reichert 02/19/2004 10:18:43 LOCALE.TRANSLATE : (1) : also, if the phrase did not change, don't save as destination language.
					DO CASE
						CASE (THIS.BaseLang == THIS.Locale)
						CASE THIS.notranslation_attempt
						OTHERWISE
						IF this.llocale
							*--------------------------------------------
							*  insert new tranlated record
							*--------------------------------------------
							LOCAL lcNotes
							lcNotes = IIF(tcPhrase==lcTranslated,"Could not be properly translated.","")
							lcTranslated = STRTRAN(STRTRAN(lcTranslated,crlf,"/r"),['],["])
							 
							   THIS.SQlexec( "INSERT INTO Locale (Phrase,LANGUAGE,Notes,ID) VALUES ( STRTRAN('"+lcTranslated+"','/r',crlf),'"+ THIS.Locale+"','"+lcNotes+"',"+TRANSFORM(lnID)+" )")
		
							*--------------------------------------------
							*  update internal array
							*--------------------------------------------
							   THIS.LoadArray()
		                ENDIF 
					ENDCASE
					*--------------------------------------------
					*  clean up
					*--------------------------------------------
					USE IN (SELECT("qtemp"))
					SELECT (fl)
					EXIT
			ENDCASE
		
		NEXT
		
		THIS.lasttranslation = lcTranslated
		THIS.lastphrase = tcPhrase
		
		*WAIT CLEAR
		
		RETURN lcTranslated
		
	ENDPROC

	PROCEDURE translate_property		&& Translates a single property of an object
		*------------------------------------------------------------
		* Description:
		* Parameters:  <para>, <req/opt>, D=<def>, <desc>
		* Return:
		* Use:
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 03/05/2004  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		LPARAMETERS oObj, tcProp, tcPos
		
		LOCAL lcCRLF, cText
		
		DO CASE 
		CASE NOT PEMSTATUS(oObj,tcProp,5) 
		CASE TYPE("oObj."+tcProp)="U" 
		CASE EMPTY(EVALUATE("oObj."+tcProp))
		OTHERWISE 
		
			IF NOT EMPTY(oObj.Locale_Original[tcPos])
				*-- reset caption to original
				cText = oObj.Locale_Original[tcPos]
			ELSE
				cText = EVALUATE("oObj."+tcProp)
				IF ALEN(oObj.Locale_Original,1) < tcPos
					DIMENSION oObj.Locale_Original[ tcPos ]
				ENDIF
				oObj.Locale_Original[tcPos] = cText
			ENDIF
			IF NOT EMPTY(cText)
				STORE THIS.GetString(cText) TO ("oObj."+tcProp)
			ENDIF
			
		ENDCASE 
		RETURN
		
	ENDPROC

	PROCEDURE unescape		&& Remove HTML conversions
		*------------------------------------------------------------
		* Description:
		* Parameters:  <para>, <req/opt>, D=<def>, <desc>
		* Return:
		* Use:
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 03/01/2004  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		
		LPARAMETERS tcStr
		
		LOCAL lcStr
		lcStr = tcStr
		IF "&"$lcStr
			lcStr = STRTRAN(lcStr,"&"+"amp;","&")
			lcStr = STRTRAN(lcStr,"&"+"nbsp;"," ")
			lcStr = STRTRAN(lcStr,"&"+"tab;"," ")
			lcStr = STRTRAN(lcStr,"&"+"gt;",">")
			lcStr = STRTRAN(lcStr,"&"+"lt;","<")
		ENDIF
		RETURN lcStr
		
		
	ENDPROC

ENDDEFINE

DEFINE CLASS locale_dummy AS container 
 	*< CLASSDATA: Baseclass="container" Timestamp="" Scale="Pixels" Uniqueid="" />

	*<DefinedPropArrayMethod>
		*m: arraylookup		&& Search the aLocale array for a phrase
		*m: callsite		&& Call a site and retreives the translated text
		*m: captioncount		&& Count all possible text that can be trnaslated
		*m: closepopup		&& Closes popup internet window.   This sometimes occurs with access Dictionary.com
		*m: convertall		&& Convert all Base phrases to all Languages
		*m: dolabel		&& Translates and runs a Label
		*m: doreport		&& Translated and runs a report,
		*m: getstring		&& Translate a string from the BaseLang to a specific language
		*m: getwindows
		*m: loadarray		&& Loads the internal array with the current language translations.
		*m: locale_assign
		*m: ping		&& Test to see if Internet is available.
		*m: registry		&& Get and Put to the Registry
		*m: setlocale		&& Translates a object and child objects.
		*m: setmenu		&& Runs and translates captions on menu.
		*m: setup
		*m: sqlexec		&& Executes SQL statement either locally or remotely.
		*m: translate		&& Translate a phrase to a different language
		*m: translate_property		&& Translates a single property of an object
		*m: unescape		&& Remove HTML conversions
		*p: baselang		&& Base source locale
		*p: debug		&& If true, display debug information while translating.
		*p: disable_images		&& Disables the images on the page.  They are not downloaded for speed.
		*p: fromregistry		&& if True, the current locale is store and retreived from the Registry.  HKEY_CURRENT_USER\Software\Locale\Locale
		*p: lastphrase		&& Last phrase translated, if the next phrase is the same, then LastTrasnlation is return instead of quering the Internet.
		*p: lasttranslation		&& Last translated phrase
		*p: lclosepopup		&& If true, any popup browser window that opens while translating is closed.
		*p: llocale
		*p: llsucces
		*p: locale		&& Current Locale
		*p: ltranslateactiveform
		*p: nallsitesattempt		&& The number a times any single site is queried before giving up and moving to the next site.
		*p: ncount		&& Number of words translated during this session.
		*p: notranslation_attempt		&& If true, none of the site tested could produce a translation.
		*p: online		&& if true, the internet is accessable.
		*p: property_list		&& List of properties that need to be translated.
		*p: quite		&& Pervents the WAIT window during translation.
		*p: resetsites		&& Reset all sites to give each a equal change at trtanslating.
		*p: searchinternet
		*p: sqlconnect		&& SQL Connection Handle. default -1
		*p: sqlconnectionstring		&& Valid SQL Connection String.  If blank, SQL statement are called as VFP.
		*p: translate_color		&& The color the text assumes will translation is occuring.  If -1, color does not change.
		*p: usedchar		&& Used to Hot Key buttons.
		*p: version		&& Class Vesion Number
		*a: alocale[1,2]		&& Collection of language translations
		*a: amenu[1,3]
		*a: awindows[1,2]		&& List of openned OS Windows.
	*</DefinedPropArrayMethod>

	HIDDEN ActiveControl,AddObject,AddProperty,BackColor,BackStyle,BorderColor,BorderWidth,Click,CloneObject,ColorSource,ControlCount,Controls,DblClick,Destroy,DragDrop,DragIcon,DragMode,DragOver,Drag,Draw,ForeColor,GotFocus,Height,HelpContextID,LostFocus,MiddleClick,MouseDown,MouseEnter,MouseIcon,MouseLeave,MouseMove,MousePointer,MouseUp,MouseWheel,Moved,Move,NewObject,Objects,OLECompleteDrag,OLEDragDrop,OLEDragMode,OLEDragOver,OLEDragPicture,OLEDrag,OLEDropEffects,OLEDropHasData,OLEDropMode,OLEGiveFeedback,OLESetData,OLEStartDrag,Picture,ReadExpression,ReadMethod,Refresh,RemoveObject,ResetToDefault,Resize,RightClick,SaveAsClass,SetAll,SetFocus,ShowWhatsThis,SpecialEffect,StatusBarText,Style,TabIndex,TabStop,Tag,ToolTipText,UIEnable,Visible,WhatsThisHelpID,Width,WriteExpression,WriteMethod,ZOrder
	PROTECTED alocale,amenu,awindows,lastphrase,lasttranslation,Name,ncount,sqlconnect,usedchar,version
	*<PropValue>
		BackStyle = 0
		baselang = Romana
		BorderColor = 255,0,255
		Comment = "8/18/2003"
		debug = .F.
		disable_images = .F.
		Enabled = .T.
		fromregistry = .T.
		Height = 20
		lastphrase = 
		lasttranslation = 
		lclosepopup = .T.
		llocale = .F.
		llsucces = .F.
		locale = English
		ltranslateactiveform = .F.
		nallsitesattempt = 1
		Name = "locale_dummy"
		ncount = 0
		notranslation_attempt = .F.
		online = .NULL.
		property_list = Caption,ToolTipText,StatusBarText
		quite = .F.
		resetsites = .F.
		searchinternet = .F.
		sqlconnect = -1
		sqlconnectionstring = 
		TabStop = .F.
		translate_color = (rgb(255,0,0))
		usedchar = ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
		version = 1.50.00299
		Width = 20
	*</PropValue>
	
	PROTECTED PROCEDURE arraylookup		&& Search the aLocale array for a phrase
	ENDPROC

	PROCEDURE callsite		&& Call a site and retreives the translated text
	ENDPROC

	PROCEDURE captioncount		&& Count all possible text that can be trnaslated
	ENDPROC

	PROCEDURE closepopup		&& Closes popup internet window.   This sometimes occurs with access Dictionary.com
	ENDPROC

	PROCEDURE convertall		&& Convert all Base phrases to all Languages
	ENDPROC

	HIDDEN PROCEDURE Destroy
		*------------------------------------------------------------
		* Description: Destory method
		* Parameters:  none
		* Return:      n/a
		* Use:         n/a
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 08/11/2003  Gregory L Reichert Initial Creation
		*  2 02/12/2004  GLR		Drop dependency on WSH
		*------------------------------------------------------------
		
		*--------------------------------------------
		*  clear aMenu to remove references to objects.
		*--------------------------------------------
		THIS.aMenu = ""
		
		*--------------------------------------------
		*  close Locale tables
		*--------------------------------------------
		IF THIS.SQLCONNECT >0
			SQLDISCONNECT( THIS.SQLCONNECT )
		ENDIF
		USE IN (SELECT("locale"))
		USE IN (SELECT("locale_lang"))
		USE IN (SELECT("locale_xref"))
		USE IN (SELECT("locale_source"))
		
		IF THIS.fromregistry
			*- Gregory L Reichert 02/12/2004 13:33:25 LOCALE.DESTROY : (2) : remove dependancy on WSH
			THIS.Registry( "HKEY_CURRENT_USER\Software\Locale\"+JUSTFNAME(_vfp.DefaultFilePath)+"\"+PROPER(JUSTSTEM(JUSTFNAME(SYS(16,0))))+"\Locale", THIS.Locale )
		ENDIF
	ENDPROC

	PROCEDURE dolabel		&& Translates and runs a Label
	ENDPROC

	PROCEDURE doreport		&& Translated and runs a report,
	ENDPROC

	PROCEDURE getstring		&& Translate a string from the BaseLang to a specific language
		LPARAMETERS tcStr
		RETURN tcStr
	ENDPROC

	PROCEDURE getwindows
	ENDPROC

	PROCEDURE Init
		*------------------------------------------------------------
		* Description: 	Initialize Object
		* Parameters:  	tcBaseLang, Opt, Def=.F., Base Language used to create form and controls.
		*				tcDestLang, Opt, Def=.F., Destination Language to be translated to.
		* Return:       N/A
		* Use:          oLocale= NewObject("Locale","Locale.vcx","","English","Spanish" )
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 08/18/2003  Gregory L Reichert Initial Creation
		*  2 2/16/2004	 GLR		Drop WebBrowser control.
		*------------------------------------------------------------
		LPARAMETERS tcBaseLang, tcDestLang
		SET SAFETY OFF
		
		ERASE ("Locale.log")
		
		*------------------------------------------------------------
		* Establish the base and locale languages.
		*------------------------------------------------------------
		IF NOT EMPTY(tcBaseLang)
			THIS.BaseLang = tcBaseLang
		ENDIF
		
		IF NOT EMPTY(tcDestLang)
			THIS.Locale = tcDestLang
		ELSE
			THIS.SETUP
		ENDIF
		
		RETURN
		
		
		*="DSN=Visual FoxPro Database;UID=;PWD=;SourceDB="+fullpath("")+"locale.dbc;SourceType=DBC;Exclusive=No;BackgroundFetch=No;Collate=Machine;Null=Yes;Deleted=Yes;"
		
		
	ENDPROC

	PROTECTED PROCEDURE loadarray		&& Loads the internal array with the current language translations.
	ENDPROC

	PROTECTED PROCEDURE locale_assign
	ENDPROC

	PROCEDURE ping		&& Test to see if Internet is available.
	ENDPROC

	PROCEDURE registry		&& Get and Put to the Registry
	ENDPROC

	PROCEDURE setlocale		&& Translates a object and child objects.
		Lparameter toObj
		Return
		
	ENDPROC

	PROCEDURE setmenu		&& Runs and translates captions on menu.
		*------------------------------------------------------------
		* Description: Register and execute MPR code.
		* Parameters:  cMenuName, Filename and extension of MPR file.
		*			   cMenuType,
		* Return:
		* Use:         oLocale.SetMenu( "MyMenu.mpr","formmenu",thisform )
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 02/16/2004  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		
		LPARAMETERS cMenuName, cMenuType, othisform
		
		
		IF TYPE("cMenuName")="L"
			IF TYPE("this.aMenu[1,1]")#"L"
				LOCAL i
				FOR i=1 TO ALEN(THIS.aMenu,1)
					DO CASE
						CASE LOWER(THIS.aMenu[i,2])="menu"
							DO (THIS.aMenu[i,1])
						CASE LOWER(THIS.aMenu[i,2])="formmenu" AND (not ISNULL(THIS.aMenu[i,3])) AND COMPOBJ(THIS.aMenu[i,3],othisform)
							KEYBOARD "{Enter}" CLEAR PLAIN
							THIS.aMenu[i,3].ZORDER(0)
							DO (THIS.aMenu[i,1]) WITH THIS.aMenu[i,3], .T.
							CLEAR TYPEAHEAD
						CASE LOWER(THIS.aMenu[i,2])="shortcut" && AND COMPOBJ(THIS.aMenu[i,3],othisform)
							THIS.aMenu[i,3].ZORDER(0)
							DO (THIS.aMenu[i,1])
					ENDCASE
				NEXT
			ENDIF
		ELSE
			IF TYPE("this.aMenu[1,1]")#"L"
				DIMENSION THIS.aMenu[ ALEN(this.aMenu,1)+1, 3]
			ENDIF
			THIS.aMenu[ALEN(this.aMenu,1),1] = cMenuName
			THIS.aMenu[ALEN(this.aMenu,1),2] = cMenuType
			THIS.aMenu[ALEN(this.aMenu,1),3] = othisform
		
			DO CASE
				CASE LOWER(cMenuType)="menu"
					DO (cMenuName)
				CASE LOWER(cMenuType)="formmenu"
					KEYBOARD "{Enter}" CLEAR PLAIN
					othisform.ZORDER(0)
					DO (cMenuName) WITH othisform, .T.
					CLEAR TYPEAHEAD
				CASE LOWER(cMenuType)="shortcut"
					DO (cMenuName)
			ENDCASE
		ENDIF
		
		RETURN
	ENDPROC

	PROTECTED PROCEDURE setup
		*------------------------------------------------------------
		* Description:	Attempt to determine the Locale of the VFP version, User OS setting, or default OS setting.
		* Parameters:  	none
		* Return:		none
		* Use:			this.Setup
		*------------------------------------------------------------
		* Id Date        By         Description
		*  1 08/04/2003  Gregory L Reichert Initial Creation
		*------------------------------------------------------------
		
		LOCAL ow, lcLocale, lnLocale, cPath
		
		lcLocale = []
		
		*--------------------------------------------
		*  try registry
		*--------------------------------------------
		IF THIS.fromregistry
			*- Gregory L Reichert 02/12/2004 13:31:22 LOCALE.SETUP : (1) : drop dependancy on WSH
			lcLocale = THIS.Registry( "HKEY_CURRENT_USER\Software\Locale\"+JUSTFNAME(_vfp.DefaultFilePath)+"\"+PROPER(JUSTSTEM(JUSTFNAME(SYS(16,0))))+"\Locale" )
		ENDIF
		
		IF EMPTY(lcLocale)
		
			*--------------------------------------------
			*  Try Foxpro level
			*--------------------------------------------
			lcLocale = IIF(VERSION(3)='00','English', lcLocale)
			lcLocale = IIF(VERSION(3)='07','Russian', lcLocale)
			lcLocale = IIF(VERSION(3)='33','French', lcLocale)
			lcLocale = IIF(VERSION(3)='34','Spanish', lcLocale)
			lcLocale = IIF(VERSION(3)='39','Italian', lcLocale)
			lcLocale = IIF(VERSION(3)='48','Polish', lcLocale)
			lcLocale = IIF(VERSION(3)='49','German', lcLocale)
			lcLocale = IIF(VERSION(3)='55','Portuguese', lcLocale)
			lcLocale = IIF(VERSION(3)='42','Czech', lcLocale)
			lcLocale = IIF(VERSION(3)='82','Korean', lcLocale)
			lcLocale = IIF(VERSION(3)='86','Simplified_Chinese', lcLocale)
			lcLocale = IIF(VERSION(3)='88','Traditional_Chinese', lcLocale)
		
			IF EMPTY(lcLocale)
		
				*-- default English
				lcLocale = "Romana"
		
				*--------------------------------------------
				*  User Level
				*--------------------------------------------
				DECLARE SHORT GetUserDefaultLangID IN kernel32
				lnLocale = GetUserDefaultLangID()
				*- Gregory L Reichert 02/09/2004 07:02:23 LOCALE.SETUP : (1) : remove CLEAR DLLS,  in VFP 6.0, it clears all DLLS.  (suggested by: Bhavbhuti Nathwani )
		
				IF lnLocale # 0x0800
					*lcLocale = IIF(lnLocale=0x0000 ,"Neutral",lcLocale)
					*lcLocale = IIF(lnLocale=0x007f ,"The language for the invariant locale (LOCALE_INVARIANT). See MAKELCID.",lcLocale)
					*lcLocale = IIF(lnLocale=0x0400 ,"Process or User Default Language",lcLocale)
					*lcLocale = IIF(lnLocale=0x0800 ,"System Default Language",lcLocale)
					*lcLocale = IIF(lnLocale=0x0436 ,"Afrikaans",lcLocale)
					*lcLocale = IIF(lnLocale=0x041c ,"Albanian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0401 ,"Arabic",lcLocale)			&& (Saudi Arabia)
					*lcLocale = IIF(lnLocale=0x0801 ,"Arabic",lcLocale)			&& (Iraq)
					*lcLocale = IIF(lnLocale=0x0c01 ,"Arabic",lcLocale)			&& (Egypt)
					*lcLocale = IIF(lnLocale=0x1001 ,"Arabic",lcLocale)			&& (Libya)
					*lcLocale = IIF(lnLocale=0x1401 ,"Arabic",lcLocale)			&& (Algeria)
					*lcLocale = IIF(lnLocale=0x1801 ,"Arabic",lcLocale)			&& (Morocco)
					*lcLocale = IIF(lnLocale=0x1c01 ,"Arabic",lcLocale)			&& (Tunisia)
					*lcLocale = IIF(lnLocale=0x2001 ,"Arabic",lcLocale)			&& (Oman)
					*lcLocale = IIF(lnLocale=0x2401 ,"Arabic",lcLocale)			&& (Yemen)
					*lcLocale = IIF(lnLocale=0x2801 ,"Arabic",lcLocale)			&& (Syria)
					*lcLocale = IIF(lnLocale=0x2c01 ,"Arabic",lcLocale)			&& (Jordan)
					*lcLocale = IIF(lnLocale=0x3001 ,"Arabic",lcLocale)			&& (Lebanon)
					*lcLocale = IIF(lnLocale=0x3401 ,"Arabic",lcLocale)			&& (Kuwait)
					*lcLocale = IIF(lnLocale=0x3801 ,"Arabic",lcLocale)			&& (U.A.E.)
					*lcLocale = IIF(lnLocale=0x3c01 ,"Arabic",lcLocale)			&& (Bahrain)
					*lcLocale = IIF(lnLocale=0x4001 ,"Arabic",lcLocale)			&& (Qatar)
					*lcLocale = IIF(lnLocale=0x042b ,"Armenian",lcLocale)
					*lcLocale = IIF(lnLocale=0x042c ,"Azeri",lcLocale)			&& (Latin)
					*lcLocale = IIF(lnLocale=0x082c ,"Azeri",lcLocale)			&& (Cyrillic)
					*lcLocale = IIF(lnLocale=0x042d ,"Basque",lcLocale)
					*lcLocale = IIF(lnLocale=0x0423 ,"Belarusian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0402 ,"Bulgarian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0455 ,"Burmese",lcLocale)
					*lcLocale = IIF(lnLocale=0x0403 ,"Catalan",lcLocale)
					*lcLocale = IIF(lnLocale=0x0404 ,"Chinese",lcLocale)			&& (Taiwan)
					*lcLocale = IIF(lnLocale=0x0804 ,"Chinese",lcLocale)			&& (PRC)
					*lcLocale = IIF(lnLocale=0x0c04 ,"Chinese",lcLocale)			&& (Hong Kong SAR, PRC)
					*lcLocale = IIF(lnLocale=0x1004 ,"Chinese",lcLocale)			&& (Singapore)
					*lcLocale = IIF(lnLocale=0x1404 ,"Chinese",lcLocale)			&& (Macau SAR)
					*lcLocale = IIF(lnLocale=0x041a ,"Croatian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0405 ,"Czech",lcLocale)
					*lcLocale = IIF(lnLocale=0x0406 ,"Danish",lcLocale)
					*lcLocale = IIF(lnLocale=0x0465 ,"Divehi",lcLocale)
					lcLocale = IIF(lnLocale=0x0413 ,"Dutch",lcLocale)			&& (Netherlands)
					lcLocale = IIF(lnLocale=0x0813 ,"Dutch",lcLocale)			&& (Belgium)
					lcLocale = IIF(lnLocale=0x0409 ,"English",lcLocale)			&& (United States)
					lcLocale = IIF(lnLocale=0x0809 ,"English",lcLocale)			&& (United Kingdom)
					lcLocale = IIF(lnLocale=0x0c09 ,"English",lcLocale)			&& (Australian)
					lcLocale = IIF(lnLocale=0x1009 ,"English",lcLocale)			&& (Canadian)
					lcLocale = IIF(lnLocale=0x1409 ,"English",lcLocale)			&& (New Zealand)
					lcLocale = IIF(lnLocale=0x1809 ,"English",lcLocale)			&& (Ireland)
					lcLocale = IIF(lnLocale=0x1c09 ,"English",lcLocale)			&& (South Africa)
					lcLocale = IIF(lnLocale=0x2009 ,"English",lcLocale)			&& (Jamaica)
					lcLocale = IIF(lnLocale=0x2409 ,"English",lcLocale)			&& (Caribbean)
					lcLocale = IIF(lnLocale=0x2809 ,"English",lcLocale)			&& (Belize)
					lcLocale = IIF(lnLocale=0x2c09 ,"English",lcLocale)			&& (Trinidad)
					lcLocale = IIF(lnLocale=0x3009 ,"English",lcLocale)			&& (Zimbabwe)
					lcLocale = IIF(lnLocale=0x3409 ,"English",lcLocale)			&& (Philippines)
					*lcLocale = IIF(lnLocale=0x0425 ,"Estonian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0438 ,"Faeroese",lcLocale)
					*lcLocale = IIF(lnLocale=0x0429 ,"Farsi",lcLocale)
					*lcLocale = IIF(lnLocale=0x040b ,"Finnish",lcLocale)
					lcLocale = IIF(lnLocale=0x040c ,"French",lcLocale)			&& (Standard)
					lcLocale = IIF(lnLocale=0x080c ,"French",lcLocale)			&& (Belgian)
					lcLocale = IIF(lnLocale=0x0c0c ,"French",lcLocale)			&& (Canadian)
					lcLocale = IIF(lnLocale=0x100c ,"French",lcLocale)			&& (Switzerland)
					lcLocale = IIF(lnLocale=0x140c ,"French",lcLocale)			&& (Luxembourg)
					lcLocale = IIF(lnLocale=0x180c ,"French",lcLocale)			&& (Monaco)
					*lcLocale = IIF(lnLocale=0x0456 ,"Galician",lcLocale)
					*lcLocale = IIF(lnLocale=0x0437 ,"Georgian",lcLocale)
					lcLocale = IIF(lnLocale=0x0407 ,"German",lcLocale)			&& (Standard)
					lcLocale = IIF(lnLocale=0x0807 ,"German",lcLocale)			&& (Switzerland)
					lcLocale = IIF(lnLocale=0x0c07 ,"German",lcLocale)			&& (Austria)
					lcLocale = IIF(lnLocale=0x1007 ,"German",lcLocale)			&& (Luxembourg)
					lcLocale = IIF(lnLocale=0x1407 ,"German",lcLocale)			&& (Liechtenstein)
					*lcLocale = IIF(lnLocale=0x0408 ,"Greek",lcLocale)
					*lcLocale = IIF(lnLocale=0x0447 ,"Gujaratci",lcLocale)
					*lcLocale = IIF(lnLocale=0x040d ,"Hebrew",lcLocale)
					*lcLocale = IIF(lnLocale=0x0439 ,"Hindi",lcLocale)
					*lcLocale = IIF(lnLocale=0x040e ,"Hungarian",lcLocale)
					*lcLocale = IIF(lnLocale=0x040f ,"Icelandic",lcLocale)
					*lcLocale = IIF(lnLocale=0x0421 ,"Indonesian",lcLocale)
					lcLocale = IIF(lnLocale=0x0410 ,"Italian",lcLocale)			&& (Standard)
					lcLocale = IIF(lnLocale=0x0810 ,"Italian",lcLocale)			&& (Switzerland)
					*lcLocale = IIF(lnLocale=0x0411 ,"Japanese",lcLocale)
					*lcLocale = IIF(lnLocale=0x044b ,"Kannada",lcLocale)
					*lcLocale = IIF(lnLocale=0x0457 ,"Konkani",lcLocale)
					*lcLocale = IIF(lnLocale=0x0412 ,"Korean",lcLocale)
					*lcLocale = IIF(lnLocale=0x0812 ,"Korean",lcLocale)			&& (Johab)
					*lcLocale = IIF(lnLocale=0x0440 ,"Kyrgyz",lcLocale)
					*lcLocale = IIF(lnLocale=0x0426 ,"Latvian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0427 ,"Lithuanian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0827 ,"Lithuanian",lcLocale)			&& (Classic)
					*lcLocale = IIF(lnLocale=0x042f ,"FYRO Macedonian",lcLocale)
					*lcLocale = IIF(lnLocale=0x043e ,"Malay",lcLocale)			&& (Malaysian)
					*lcLocale = IIF(lnLocale=0x083e ,"Malay",lcLocale)			&& (Brunei Darussalam)
					*lcLocale = IIF(lnLocale=0x044e ,"Maratchi",lcLocale)
					*lcLocale = IIF(lnLocale=0x0450 ,"Mongolian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0414 ,"Norwegian",lcLocale)			&& (Bokmal)
					*lcLocale = IIF(lnLocale=0x0814 ,"Norwegian",lcLocale)			&& (Nynorsk)
					*lcLocale = IIF(lnLocale=0x0415 ,"Polish",lcLocale)
					lcLocale = IIF(lnLocale=0x0416 ,"Portuguese",lcLocale)			&& (Brazil)
					lcLocale = IIF(lnLocale=0x0816 ,"Portuguese",lcLocale)			&& (Portugal)
					*lcLocale = IIF(lnLocale=0x0446 ,"Punjabi",lcLocale)
					lcLocale = IIF(lnLocale=0x0418 ,"Romana",lcLocale)
					lcLocale = IIF(lnLocale=0x0419 ,"Russian",lcLocale)
					*lcLocale = IIF(lnLocale=0x044f ,"Sanskrit",lcLocale)
					*lcLocale = IIF(lnLocale=0x0c1a ,"Serbian",lcLocale)			&& (Cyrillic)
					*lcLocale = IIF(lnLocale=0x081a ,"Serbian",lcLocale)			&& (Latin)
					*lcLocale = IIF(lnLocale=0x041b ,"Slovak",lcLocale)
					*lcLocale = IIF(lnLocale=0x0424 ,"Slovenian",lcLocale)
					lcLocale = IIF(lnLocale=0x040a ,"Spanish",lcLocale)			&& (Spain, Traditional Sort)
					lcLocale = IIF(lnLocale=0x080a ,"Spanish",lcLocale)			&& (Mexican)
					lcLocale = IIF(lnLocale=0x0c0a ,"Spanish",lcLocale)			&& (Spain, Modern Sort)
					lcLocale = IIF(lnLocale=0x100a ,"Spanish",lcLocale)			&& (Guatemala)
					lcLocale = IIF(lnLocale=0x140a ,"Spanish",lcLocale)			&& (Costa Rica)
					lcLocale = IIF(lnLocale=0x180a ,"Spanish",lcLocale)			&& (Panama)
					lcLocale = IIF(lnLocale=0x1c0a ,"Spanish",lcLocale)			&& (Dominican Republic)
					lcLocale = IIF(lnLocale=0x200a ,"Spanish",lcLocale)			&& (Venezuela)
					lcLocale = IIF(lnLocale=0x240a ,"Spanish",lcLocale)			&& (Colombia)
					lcLocale = IIF(lnLocale=0x280a ,"Spanish",lcLocale)			&& (Peru)
					lcLocale = IIF(lnLocale=0x2c0a ,"Spanish",lcLocale)			&& (Argentina)
					lcLocale = IIF(lnLocale=0x300a ,"Spanish",lcLocale)			&& (Ecuador)
					lcLocale = IIF(lnLocale=0x340a ,"Spanish",lcLocale)			&& (Chile)
					lcLocale = IIF(lnLocale=0x380a ,"Spanish",lcLocale)			&& (Uruguay)
					lcLocale = IIF(lnLocale=0x3c0a ,"Spanish",lcLocale)			&& (Paraguay)
					lcLocale = IIF(lnLocale=0x400a ,"Spanish",lcLocale)			&& (Bolivia)
					lcLocale = IIF(lnLocale=0x440a ,"Spanish",lcLocale)			&& (El Salvador)
					lcLocale = IIF(lnLocale=0x480a ,"Spanish",lcLocale)			&& (Honduras)
					lcLocale = IIF(lnLocale=0x4c0a ,"Spanish",lcLocale)			&& (Nicaragua)
					lcLocale = IIF(lnLocale=0x500a ,"Spanish",lcLocale)			&& (Puerto Rico)
					*lcLocale = IIF(lnLocale=0x0430 ,"Sutu",lcLocale)
					*lcLocale = IIF(lnLocale=0x0441 ,"Swahili",lcLocale)			&& (Kenya)
					*lcLocale = IIF(lnLocale=0x041d ,"Swedish",lcLocale)
					*lcLocale = IIF(lnLocale=0x081d ,"Swedish",lcLocale)			&& (Finland)
					*lcLocale = IIF(lnLocale=0x045a ,"Syriac",lcLocale)
					*lcLocale = IIF(lnLocale=0x0449 ,"Tamil",lcLocale)
					*lcLocale = IIF(lnLocale=0x0444 ,"Tatar",lcLocale)			&& (Tatarstan)
					*lcLocale = IIF(lnLocale=0x044a ,"Telugu",lcLocale)
					*lcLocale = IIF(lnLocale=0x041e ,"Thai",lcLocale)
					*lcLocale = IIF(lnLocale=0x041f ,"Turkish",lcLocale)
					*lcLocale = IIF(lnLocale=0x0422 ,"Ukrainian",lcLocale)
					*lcLocale = IIF(lnLocale=0x0420 ,"Urdu",lcLocale)			&& (Pakistan)
					*lcLocale = IIF(lnLocale=0x0820 ,"Urdu",lcLocale)			&& (India)
					*lcLocale = IIF(lnLocale=0x0443 ,"Uzbek",lcLocale)			&& (Latin)
					*lcLocale = IIF(lnLocale=0x0843 ,"Uzbek",lcLocale)			&& (Cyrillic)
					*lcLocale = IIF(lnLocale=0x042a ,"Vietnamese",lcLocale)
				ELSE
					*--------------------------------------------
					*  System Level
					*--------------------------------------------
					* - get from System Default
					DECLARE INTEGER GetSystemDefaultLangID IN kernel32
					lnLocale = BITAND( GetSystemDefaultLangID(),0x1FF)
					*- Gregory L Reichert 02/09/2004 07:02:43 LOCALE.SETUP : (1) : remove CLEAR DLLS,  in VFP 6.0, it clears all DLLS.  (suggested by: Bhavbhuti Nathwani )
		
					*lcLocale = IIF(lnLocale=0x00 ,"Neutral", lcLocale )
					*lcLocale = IIF(lnLocale=0x01 ,"Arabic", lcLocale )
					*lcLocale = IIF(lnLocale=0x02 ,"Bulgarian", lcLocale )
					*lcLocale = IIF(lnLocale=0x03 ,"Catalan", lcLocale )
					*lcLocale = IIF(lnLocale=0x04 ,"Chinese", lcLocale )
					*lcLocale = IIF(lnLocale=0x05 ,"Czech", lcLocale )
					lcLocale = IIF(lnLocale=0x06 ,"Danish", lcLocale )
					lcLocale = IIF(lnLocale=0x07 ,"German", lcLocale )
					lcLocale = IIF(lnLocale=0x08 ,"Greek", lcLocale )
					lcLocale = IIF(lnLocale=0x09 ,"English", lcLocale )
					lcLocale = IIF(lnLocale=0x0a ,"Spanish", lcLocale )
					*lcLocale = IIF(lnLocale=0x0b ,"Finnish", lcLocale )
					lcLocale = IIF(lnLocale=0x0c ,"French", lcLocale )
					*lcLocale = IIF(lnLocale=0x0d ,"Hebrew", lcLocale )
					*lcLocale = IIF(lnLocale=0x0e ,"Hungarian", lcLocale )
					*lcLocale = IIF(lnLocale=0x0f ,"Icelandic", lcLocale )
					lcLocale = IIF(lnLocale=0x10 ,"Italian", lcLocale )
					*lcLocale = IIF(lnLocale=0x11 ,"Japanese", lcLocale )
					*lcLocale = IIF(lnLocale=0x12 ,"Korean", lcLocale )
					lcLocale = IIF(lnLocale=0x13 ,"Dutch", lcLocale )
					lcLocale = IIF(lnLocale=0x14 ,"Norwegian", lcLocale )
					*lcLocale = IIF(lnLocale=0x15 ,"Polish", lcLocale )
					lcLocale = IIF(lnLocale=0x16 ,"Portuguese", lcLocale )
					lcLocale = IIF(lnLocale=0x18 ,"Romana", lcLocale )
					lcLocale = IIF(lnLocale=0x19 ,"Russian", lcLocale )
					*lcLocale = IIF(lnLocale=0x1a ,"Croatian", lcLocale )
					*lcLocale = IIF(lnLocale=0x1a ,"Serbian", lcLocale )
					*lcLocale = IIF(lnLocale=0x1b ,"Slovak", lcLocale )
					*lcLocale = IIF(lnLocale=0x1c ,"Albanian", lcLocale )
					*lcLocale = IIF(lnLocale=0x1d ,"Swedish", lcLocale )
					*lcLocale = IIF(lnLocale=0x1e ,"Thai", lcLocale )
					*lcLocale = IIF(lnLocale=0x1f ,"Turkish", lcLocale )
					*lcLocale = IIF(lnLocale=0x20 ,"Urdu", lcLocale )
					*lcLocale = IIF(lnLocale=0x21 ,"Indonesian", lcLocale )
					*lcLocale = IIF(lnLocale=0x22 ,"Ukrainian", lcLocale )
					*lcLocale = IIF(lnLocale=0x23 ,"Belarusian", lcLocale )
					*lcLocale = IIF(lnLocale=0x24 ,"Slovenian", lcLocale )
					*lcLocale = IIF(lnLocale=0x25 ,"Estonian", lcLocale )
					*lcLocale = IIF(lnLocale=0x26 ,"Latvian", lcLocale )
					*lcLocale = IIF(lnLocale=0x27 ,"Lithuanian", lcLocale )
					*lcLocale = IIF(lnLocale=0x29 ,"Farsi", lcLocale )
					*lcLocale = IIF(lnLocale=0x2a ,"Vietnamese", lcLocale )
					*lcLocale = IIF(lnLocale=0x2b ,"Armenian", lcLocale )
					*lcLocale = IIF(lnLocale=0x2c ,"Azeri", lcLocale )
					*lcLocale = IIF(lnLocale=0x2d ,"Basque", lcLocale )
					*lcLocale = IIF(lnLocale=0x2f ,"FYRO Macedonian", lcLocale )
					*lcLocale = IIF(lnLocale=0x36 ,"Afrikaans", lcLocale )
					*lcLocale = IIF(lnLocale=0x37 ,"Georgian", lcLocale )
					*lcLocale = IIF(lnLocale=0x38 ,"Faeroese", lcLocale )
					*lcLocale = IIF(lnLocale=0x39 ,"Hindi", lcLocale )
					*lcLocale = IIF(lnLocale=0x3e ,"Malay", lcLocale )
					*lcLocale = IIF(lnLocale=0x3f ,"Kazak", lcLocale )
					*lcLocale = IIF(lnLocale=0x40 ,"Kyrgyz", lcLocale )
					*lcLocale = IIF(lnLocale=0x41 ,"Swahili", lcLocale )
					*lcLocale = IIF(lnLocale=0x43 ,"Uzbek", lcLocale )
					*lcLocale = IIF(lnLocale=0x44 ,"Tatar", lcLocale )
					*lcLocale = IIF(lnLocale=0x46 ,"Punjabi", lcLocale )
					*lcLocale = IIF(lnLocale=0x47 ,"Gujaratci", lcLocale )
					*lcLocale = IIF(lnLocale=0x49 ,"Tamil", lcLocale )
					*lcLocale = IIF(lnLocale=0x4a ,"Telugu", lcLocale )
					*lcLocale = IIF(lnLocale=0x4b ,"Kannada", lcLocale )
					*lcLocale = IIF(lnLocale=0x4e ,"Maratchi", lcLocale )
					*lcLocale = IIF(lnLocale=0x4f ,"Sanskrit", lcLocale )
					*lcLocale = IIF(lnLocale=0x50 ,"Mongolian", lcLocale )
					*lcLocale = IIF(lnLocale=0x56 ,"Galician", lcLocale )
					*lcLocale = IIF(lnLocale=0x57 ,"Konkani", lcLocale )
					*lcLocale = IIF(lnLocale=0x5a ,"Syriac", lcLocale )
					*lcLocale = IIF(lnLocale=0x65 ,"Divehi", lcLocale )
		
				ENDIF
			ENDIF
		ENDIF
		THIS.Locale = lcLocale
		
		RETURN
		
		
	ENDPROC

	PROCEDURE sqlexec		&& Executes SQL statement either locally or remotely.
	ENDPROC

	PROCEDURE translate		&& Translate a phrase to a different language
	ENDPROC

	PROCEDURE translate_property		&& Translates a single property of an object
	ENDPROC

	PROCEDURE unescape		&& Remove HTML conversions
	ENDPROC

ENDDEFINE
