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

	*<DefinedPropArrayMethod>
		*p: acstyle
		*p: cpk		&& Numele campului cheie primara ( PK ) din cursorul atasat
		*p: lastdisplayvalue
		*p: lastsellength
		*p: lastselstart
		*p: npk		&& Valoarea campului cheie primara ( PK ) corespunzator valorii afisate
	*</DefinedPropArrayMethod>

	*<PropValue>
		acstyle = 2
		BorderStyle = 1
		cpk = 
		FontCharSet = 238
		Format = "!"
		Height = 24
		lastdisplayvalue = 
		lastsellength = 0
		lastselstart = 0
		Name = "_cbautofill"
		npk = 0
		RowSourceType = 2
		SelectOnEntry = .T.
		Style = 0
		Width = 240
	*</PropValue>
	
	PROCEDURE InteractiveChange
		*!*	modificare adrese parteneri 12.2013
		If This.Style = 0
		*!*	modificare adrese parteneri 12.2013	^
			Local lnStyle, lnLastKey, lcDisplayValue
			lnLastKey=Lastkey()
			lnStyle = This.Style
			*!*	modificare adrese parteneri 12.2013
			*!*		If This.Style = 2
			*!*			This.Style = 0
			*!*		Endif
			*!*	modificare adrese parteneri 12.2013	^
			If (lnLastKey>=32 And lnLastKey<=126)
				If This.SelStart>=1
					lcDisplayValue=Substr(This.DisplayValue,1,This.SelStart-1)+(Chr(lnLastKey))
				Else
					lcDisplayValue=(Chr(lnLastKey))+Allt(This.DisplayValue)
				Endif
				If Empty(lcDisplayValue)
					lcDisplayValue=Allt(Chr(lnLastKey))
				Endif
				For i = 1 To This.ListCount
					If Upper(lcDisplayValue)=Upper(Substr(This.List(i),1,Len(lcDisplayValue)))
						This.DisplayValue=This.List(i)
						If Len(Allt(This.DisplayValue))>Len(lcDisplayValue)
							This.SelStart=Len(lcDisplayValue)
							This.SelLength=Len(Allt(This.DisplayValue))-Len(lcDisplayValue)
						Endif
						This.lastdisplayvalue = This.DisplayValue
						This.lastselstart = This.SelStart
						This.lastsellength = This.SelLength
						Return
					Endif
				Endfor
		*&& Removed the next for line to allow for the DisplayValue to be added to the table.
		*!*        if this.acStyle = 2
		*!*            this.displayvalue = this.lastdisplayvalue
		*!*            this.selstart = this.lastselstart
		*!*            this.sellength = this.lastsellength
		*!*        endif
			Endif
		*!*	modificare adrese parteneri 12.2013
		Else
			DoDefault()
		Endif
		*!*	modificare adrese parteneri 12.2013	^
	ENDPROC

	PROCEDURE Requery
		This.Value = This.DisplayValue && Just to reset the display value
	ENDPROC

	PROCEDURE Valid
		*!* 09.03.2014
		*!* marius.mutu
		*!*	in caz ca sunt mai multe campuri delimitate prin virgula, iau primul camp
		
		*!*	modificare adrese parteneri 12.2013
		Local cTableName,cFieldName,nAnswer,cValue,cPK
		cTableName = Substr(This.RowSource,1,At('.',This.RowSource)-1)
		If This.Style = 0
		*!*	modificare adrese parteneri 12.2013	^
			If !Empty(This.DisplayValue)
		*Store substr(This.RowSource,1,at('.',This.RowSource)-1) To cTableName &&Won't work for VFP5.0
		*Store substr(This.RowSource,at('.',This.RowSource)+1) To cFieldName && This is normally used for 3 character extension, but it works for any lenght. Won't work for VFP5.0
				cFieldName = Substr(This.RowSource,At('.',This.RowSource)+1)
				cFieldName = GETWORDNUM(m.cFieldName,1, ',') && in caz ca sunt mai multe campuri delimitate prin virgula, iau primul camp
				Select (cTableName)
				Locate For &cFieldName = This.DisplayValue
				If !Found()
		*nAnswer = Messagebox("Aceasta valoare nu exista in baza de date,"+Chr(13)+"Doriti sa o adaugati?",36,"")
		*If nAnswer = 6
					Insert Into &cTableName (&cFieldName) Values (This.DisplayValue)
					If CursorGetProp("Buffering") > 1  && Check to see if we should use tableupdate
						Tableupdate(1,.T.,cTableName)
					Endif
					This.Requery() && To reset the display value
		*!*	        Else
		*!*	            Store '' To This.DisplayValue
		*!*	        Endif
				Endif
			Endif
		*!*	modificare adrese parteneri 12.2013
		Else
			DoDefault()
		Endif
		cPK	= This.cpk
		If !EMPTY(cPK)
			Select (cTableName)
			This.npk = &cPK
		Endif
		*!*	modificare adrese parteneri 12.2013	^
		
	ENDPROC

ENDDEFINE

DEFINE CLASS _cbbase AS _combobox OF "_baza.vcx" 
 	*< CLASSDATA: Baseclass="combobox" Timestamp="" Scale="Pixels" Uniqueid="" />

	#INCLUDE "c:\program files\microsoft visual foxpro 8\foxpro.h"
	*<PropValue>
		FontCharSet = 238
		Name = "_cbbase"
	*</PropValue>

ENDDEFINE

DEFINE CLASS _cbsearch AS _combobox OF "_baza.vcx" 
 	*< CLASSDATA: Baseclass="combobox" Timestamp="" Scale="Pixels" Uniqueid="" />

	*<DefinedPropArrayMethod>
		*p: acstyle
		*p: lastdisplayvalue
		*p: lastsellenght
		*p: lastselstart
		*p: sellenght
	*</DefinedPropArrayMethod>

	*<PropValue>
		acstyle = 2
		lastdisplayvalue = 
		lastsellenght = 0
		lastselstart = 0
		Name = "_cbsearch"
		sellenght = 0
		Style = 0
		_memberdata = <VFPData>
			<memberdata name="lastselstart" display="lastSelStart"/>
			<memberdata name="lastsellenght" display="lastSelLenght"/>
			<memberdata name="lastdisplayvalue" display="lastDisplayValue"/>
			<memberdata name="sellenght" display="selLenght"/>
		</VFPData>
	*</PropValue>
	
	PROCEDURE InteractiveChange
		Local lnStyle, lnLastKey, lcDisplayValue
		lnLastKey=Lastkey()
		lnStyle = This.Style
		If This.Style = 2
			This.Style = 0
		Endi
		If (lnLastKey>=32 And lnLastKey<=126)
			If This.SelStart>=1
				lcDisplayValue=Substr(This.DisplayValue,1,This.SelStart-1)+(Chr(lnLastKey))
			Else
				lcDisplayValue=(Chr(lnLastKey))+Allt(This.DisplayValue)
			Endi
			If Empty(lcDisplayValue)
				lcDisplayValue=Allt(Chr(lnLastKey))
			Endi
			For i = 1 To This.ListCount
				If Upper(lcDisplayValue) == Upper(Substr(This.List(i),1,Len(lcDisplayValue)))
					This.DisplayValue=This.List(i)
					This.SelStart=Len(lcDisplayValue)
					nlLength=Len(Allt(This.DisplayValue))-Len(lcDisplayValue)
					This.SelLength=Iif(nlLength <0,0,nlLength)
					This.lastdisplayvalue = This.DisplayValue
					This.lastselstart = This.SelStart
					This.lastsellenght = This.sellenght
					Return
				Endi
			Endfor
		Endif
		
	ENDPROC

ENDDEFINE

DEFINE CLASS _cbsql AS _combobox OF "_baza.vcx" 
 	*< CLASSDATA: Baseclass="combobox" Timestamp="" Scale="Pixels" Uniqueid="" />

	*<DefinedPropArrayMethod>
		*m: findrow
		*m: log
		*m: resettext
		*p: csearchstring
		*p: isclick
		*p: llimittolist
		*p: pcursorname
		*p: pfieldactiv
		*p: prowsource
		*p: secondfield
		*p: secondsearchfield
	*</DefinedPropArrayMethod>

	*<PropValue>
		csearchstring = 
		Height = 24
		isclick = .F.
		llimittolist = .T.
		Name = "_cbsql"
		pcursorname = 
		pfieldactiv = 
		prowsource = 
		secondfield = 
		secondsearchfield = 
		SelectOnEntry = .T.
		Style = 0
		Width = 97
		_memberdata = <VFPData>
			<memberdata name="resettext" display="ResetText"/>
			<memberdata name="isclick" display="isClick"/>
			<memberdata name="findrow" display="FindRow"/>
			<memberdata name="pfieldactiv" display="pFieldActiv"/>
			<memberdata name="secondfield" display="SecondField"/>
			<memberdata name="csearchstring" display="cSearchString"/>
			<memberdata name="prowsource" display="pRowSource"/>
			<memberdata name="pcursorname" display="pCursorName"/>
			<memberdata name="secondsearchfield" display="SecondSearchField"/>
			<memberdata name="llimittolist" display="lLimitToList"/>
			<memberdata name="selstart" display="SelStart"/>
		</VFPData>
	*</PropValue>
	
	PROCEDURE Click
		This.Log('Click')
		this.isclick = .T.
		this.sellength = MAX(LEN(RTRIM(NVL(this.displayvalue,''))) - this.selstart, 0)
		this.csearchstring = LEFT(NVL(this.displayvalue,''), this.selstart)
		
		This.Log('Click ^')
	ENDPROC

	PROCEDURE findrow
		This.Log('FindRow')
		LOCAL lcExact
		lcExact = SET("Exact")
		SET EXACT OFF 
		LOCATE FOR  UPPER(EVALUATE(this.pfieldactiv)) = UPPER(this.csearchstring)
		IF  !FOUND()
		     IF  !EMPTY(this.secondfield)
		          LOCATE FOR EVALUATE(this.secondfield) =  UPPER(this.csearchstring) +  " " OR EVALUATE(this.secondfield) =  "RO" +  UPPER(this.csearchstring) +  " "
		          IF !FOUND()
		               LOCATE FOR  EVALUATE(this.secondfield) =  UPPER(this.csearchstring) OR EVALUATE(this.secondfield) =  "RO" +  UPPER(this.csearchstring)
		          ENDIF
		          SET EXACT &lcExact
		          IF FOUND()
		               RETURN 3
		          ELSE
		               RETURN 2
		          ENDIF
		     ELSE
		          SET EXACT &lcExact
		          RETURN 2
		     ENDIF
		ELSE
		     SET EXACT &lcExact
		     RETURN 1
		ENDIF
		
	ENDPROC

	PROCEDURE GotFocus
		LOCAL lcDisplayValue
		This.Log('GotFocus')
		lcDisplayValue = NVL(this.displayvalue, '')
		IF this.selectonentry AND !this.isClick AND INLIST(LASTKEY(), 13, 5, 24, 4, 19, 9) AND !ISNULL(this.displayvalue)
		     FOR iii = 1 TO  LEN(ALLTRIM(this.displayvalue))
		          KEYBOARD '{SHIFT + rightarrow}'
		     ENDFOR
		ENDIF
		this.selstart = 0
		this.sellength = LEN(RTRIM(m.lcDisplayValue))
		this.csearchstring = ""
		this.isclick = .F.
		This.Log('GotFocus ^')
	ENDPROC

	PROCEDURE InteractiveChange
		This.Log('InteractiveChange')
		this.csearchstring = ""
		This.Log('InteractiveChange ^')
	ENDPROC

	PROCEDURE KeyPress
		LPARAMETERS nkeycode, nshiftaltctrl
		LOCAL lnrecno, msearchstring, mselstart, lcDisplayValue
		This.Log('KeyPress')
		
		
		lcDisplayValue = NVL(this.DisplayValue, '')
		SELECT (this.pcursorname)
		IF (EMPTY(this.csearchstring)  OR (m.lcDisplayValue <>  this.csearchstring AND m.lcDisplayValue <> "RO" + this.csearchstring)) AND !EMPTY(m.lcDisplayValue)
		     this.resettext()
		     IF nkeycode = 13
		          this.findrow()
		     ENDIF
		ENDIF
		msearchstring = this.csearchstring
		mselstart = 0
		IF BITAND(4, nshiftaltctrl) == 4
		     RETURN
		ENDIF
		IF (nkeycode = 54 .AND.  ;
		   nshiftaltctrl = 1) .OR.  ;
		   (nshiftaltctrl = 2 .AND.  ;
		   nkeycode = 97)
		     this.resettext()
		ENDIF
		IF this.rowsourcetype = 3 AND !INLIST(nkeycode, 5, 24, 13, 54, 160, 152)
		     IF  !EMPTY(this.prowsource)
		          this.rowsource = ""
		          this.requery()
		          this.rowsource = this.prowsource
		          this.prowsource = ""
		          this.requery()
		          this.refresh()
		          this.csearchstring = ""
		     ELSE
		          IF nkeycode = 10
		               IF  !EMPTY(this.secondsearchfield)
		                    mfieldactiv =  this.secondsearchfield
		               ELSE
		                    mfieldactiv =  this.pfieldactiv
		               ENDIF
		               mQuery="SELECT * FROM (This.pCursorName) WHERE ALLTRIM(This.DisplayValue)$ UPPER(&mFieldActiv) INTO CURSOR (This.pCursorName)"
		               IF this.rowsource <>  mquery
		                    NODEFAULT
		                    this.prowsource =  this.rowsource
		                    this.rowsource =  mquery
		                    this.requery()
		                    this.resettext()
		                    KEYBOARD '{ALT + DNARROW}'
		                    RETURN
		               ENDIF
		          ENDIF
		     ENDIF
		ENDIF
		IF INLIST(nkeycode, 6) OR (INLIST(nkeycode, 52, 54)  AND BITAND(1, nshiftaltctrl) ==  1) .OR. (INLIST(2, 26) .AND.  BITAND(2, nshiftaltctrl) ==  2)
		     RETURN
		ENDIF
		SELECT (this.pcursorname)
		lnrecno = RECNO()
		DO CASE
		     CASE nkeycode = 4
		          this.csearchstring = LEFT(this.csearchstring,  this.selstart) +  SUBSTR(m.lcDisplayValue,  this.selstart +  1,  1)
		          mselstart = this.selstart +  1
		     CASE nkeycode = 19
		          this.csearchstring = LEFT(this.csearchstring,  this.selstart -  1)
		          mselstart = this.selstart -  1
		          this.sellength = MAX(LEN(RTRIM(m.lcDisplayValue)) -  mselstart,  0)
		          IF mselstart < 0
		               RETURN
		          ENDIF
		     CASE nkeycode = 7
		          IF this.selstart = 0
		               this.csearchstring = ""
		               this.displayvalue = ""
		          ELSE
		               this.csearchstring = LEFT(this.csearchstring, this.selstart) +  RIGHT(this.csearchstring,  LEN(this.csearchstring) -  this.selstart -  1)
		               this.displayvalue = this.csearchstring
		          ENDIF
		          mselstart = LEN(this.csearchstring)
		     CASE nkeycode = 127
		          IF this.selstart = 0
		               this.csearchstring =  ""
		               this.displayvalue =  ""
		          ELSE
		               this.csearchstring = LEFT(this.csearchstring,  this.selstart -  1) +  RIGHT(this.csearchstring,  LEN(this.csearchstring) -  this.selstart)
		               this.displayvalue =  this.csearchstring
		               mselstart = LEN(this.csearchstring)
		          ENDIF
		     CASE nkeycode = 24
		          IF  .NOT. EOF()
		               SKIP
		          ENDIF
		          IF EOF()
		               GOTO BOTTOM
		          ENDIF
		     CASE nkeycode = 5
		          IF  .NOT. BOF()
		               SKIP -1
		          ENDIF
		          IF BOF()
		               GOTO TOP
		          ENDIF
		     CASE BETWEEN(nkeycode, 32, 126) OR BETWEEN(nkeycode, 97, 122) OR BETWEEN(nkeycode, 48,  57)
		          IF this.selstart = 0 AND this.sellength > 1
		               this.csearchstring = UPPER(CHR(nkeycode))
		          ELSE
		               this.csearchstring = LEFT(this.csearchstring, this.selstart) +  UPPER(CHR(nkeycode)) +  RIGHT(this.csearchstring,  LEN(this.csearchstring) - this.selstart)
		          ENDIF
		          mselstart = this.selstart + 1
		     OTHERWISE
		          RETURN
		ENDCASE
		NODEFAULT
		msemafor = 0
		IF nkeycode <> 4 AND nkeycode <>  19 AND nkeycode <> 5 AND nkeycode <> 24 AND !EMPTY(this.csearchstring)
		     msemafor = this.findrow()
		ENDIF
		IF nkeycode <> 7 AND nkeycode <>  127 AND nkeycode <> 4 AND nkeycode <> 19
		     IF (EMPTY(this.csearchstring) OR msemafor = 2) AND nkeycode <> 5 AND nkeycode <> 24
		          IF lnrecno > RECCOUNT()
		               GOTO TOP
		          ELSE
		               GOTO lnrecno
		          ENDIF
		          IF  !this.lLimitToList
		               this.displayvalue = this.csearchstring
		          ELSE
		               this.csearchstring = msearchstring
		          ENDIF
		     ELSE
		          IF msemafor = 1 OR nkeycode = 5 OR nkeycode = 24
		               this.displayvalue =  EVALUATE(this.pfieldactiv)
		               IF nkeycode = 5  OR nkeycode =  24
		                    this.resettext()
		                    RETURN
		               ENDIF
		          ENDIF
		          IF msemafor = 3
		               this.displayvalue =  EVALUATE(this.secondfield)
		          ENDIF
		     ENDIF
		ENDIF
		this.selstart = MAX(mselstart, 0)
		IF TXTWIDTH(RTRIM(NVL(this.DisplayValue,'')),  this.fontname, this.fontsize) *  FONTMETRIC(6, this.fontname,  this.fontsize) < this.width -  15
		     this.sellength = MAX(LEN(RTRIM(NVL(this.DisplayValue,''))) -  LEN(RTRIM(this.csearchstring)),  0)
		ELSE
		     this.sellength = 0
		ENDIF
		
		This.Log('KeyPress ^')
	ENDPROC

	PROCEDURE log
		LPARAMETERS tcEvent
		lcText = TRANSFORM(tcEvent) + ' ' + ttoc(DATETIME()) + ' selstart ' + TRANSFORM(this.SelStart) + CHR(13)
		STRTOFILE(m.lcText, "e:\selstart.txt", .T.)
	ENDPROC

	PROCEDURE LostFocus
		IF  .NOT. EMPTY(this.prowsource)
		     SELECT (this.pcursorname)
		     mcamp = ALLTRIM(this.pcursorname) +  ;
		             "." +  ;
		             this.pfieldactiv
		     mCurrentValue=&mCamp
		     mthisvalue = this.value
		     this.rowsource = this.prowsource
		     this.prowsource = ""
		     this.requery()
		     SELECT (this.pcursorname)
		     LOCATE FOR &mCamp=mCurrentValue
		     this.value = mthisvalue
		ENDIF
		IF  .NOT. EMPTY(this.secondfield)
		     SELECT (this.pcursorname)
		
		     IF this.displayvalue =  ;
		        EVALUATE(this.secondfield)  ;
		        .OR. "RO" +  ;
		        this.displayvalue =  ;
		        EVALUATE(this.secondfield)
		          this.displayvalue = EVALUATE(this.pfieldactiv)
		     ENDIF
		ENDIF
		this.csearchstring = ""
		this.selstart = 0
		
	ENDPROC

	PROCEDURE MouseMove
		LPARAMETERS nButton, nShift, nXCoord, nYCoord
		this.isclick = .T.
		
	ENDPROC

	PROCEDURE resettext
		This.Log('ResetText')
		this.csearchstring = ALLTRIM(NVL(this.displayvalue,''))
		
		this.selstart = 0
		this.sellength = LEN(RTRIM(NVL(this.displayvalue,'')))
		
		This.Log('ResetText ^')
	ENDPROC

ENDDEFINE

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

	*<DefinedPropArrayMethod>
		*m: getdata		&& Retrieves data from the OLE drag and drop DataObject object.
		*m: refreshdata
		*m: selectdata
		*p: csearchstring
		*p: csourceorder		&& Ordinea pentru SourceSql
		*p: csourcesql		&& Select SQL fara where si order
		*p: csourcewhere		&& Conditia Where pentru cSourceSql
		*p: isclick
		*p: llimittolist
		*p: ncharcountbegin		&& Dupa cate caractere incepe cautarea pe server. Implicit 0
		*p: pcursorname		&& Numele cursorului
		*p: pfieldactiv		&& Campul dupa care se face cautarea
		*p: prowsource		&& Camp intern
		*p: psecondfield		&& Al doilea camp de cautare (optional)
		*p: _memberdata		&& XML Metadata for customizable properties
	*</DefinedPropArrayMethod>

	*<PropValue>
		BackColor = 252,252,225
		BorderStyle = 0
		csearchstring = 
		csourceorder = 
		csourcesql = 
		csourcewhere = 
		Format = "K"
		Height = 24
		isclick = .F.
		llimittolist = .F.
		Name = "combosql"
		ncharcountbegin = 0
		pcursorname = 
		pfieldactiv = 
		prowsource = 
		psecondfield = 
		RowSourceType = 3
		SpecialEffect = 1
		Width = 100
		_memberdata = <VFPData>
			<memberdata name="pfieldactiv" display="pFieldActiv"/>
			<memberdata name="pcursorname" display="pCursorName"/>
			<memberdata name="llimittolist" display="lLimitToList"/>
			<memberdata name="prowsource" display="pRowSource"/>
			<memberdata name="csearchstring" display="cSearchString"/>
			<memberdata name="isclick" display="isClick"/>
			<memberdata name="csourcesql" display="cSourceSql"/>
			<memberdata name="csourcewhere" display="cSourceWhere"/>
			<memberdata name="csourceorder" display="cSourceOrder"/>
			<memberdata name="refreshdata" display="RefreshData"/>
			<memberdata name="getdata" display="GetData"/>
			<memberdata name="selectdata" display="SelectData"/>
			<memberdata name="psecondfield" display="pSecondField"/>
			<memberdata name="ncharcountbegin" display="nCharCountBegin"/>
		</VFPData>
	*</PropValue>
	
	PROCEDURE Click
		This.isclick = .T.
		This.SelLength = Max(Len(Rtrim(This.DisplayValue)) - this.SelStart, 0)
		
		This.csearchstring = Left(This.DisplayValue, This.SelStart)
		
	ENDPROC

	PROCEDURE getdata		&& Retrieves data from the OLE drag and drop DataObject object.
	ENDPROC

	PROCEDURE Init
		Local lcCursor, lcCursorS, lcSourceSql, lcSql, lcSqlRowSource, llSucces
		lcSourceSql = This.cSourceSql
		lcCursor = This.pCursorName
		lcCursorS= 's' + m.lcCursor
		lcSql = m.lcSourceSql + " where 1=2"
		lcSqlRowSource = "select * from " + m.lcCursorS + " into cursor " + m.lcCursor
		
		llSucces = This.RefreshData(0)
		If m.llSucces
			Select (m.lcCursorS)
			Append Blank
			TABLEUPDATE()
		Endif
		This.RowSource = m.lcSqlRowSource
	ENDPROC

	PROCEDURE InteractiveChange
		This.csearchstring = ""
	ENDPROC

	PROCEDURE KeyPress
		Lparameters nkeycode, nshiftaltctrl
		Local lnrecno, lcSearchString, m.lnSelStart, llQueried
		llQueried = .F.
		lcSearchString = This.csearchstring
		lnSelStart = 0
		
		*!*	IF nkeycode = 24
		*!*		SET STEP ON 
		*!*	ENDIF 
		If Bitand(4, nshiftaltctrl) == 4
			Return
		Endif
		If nkeycode = 54 .And. nshiftaltctrl = 1
			This.SelStart = 0
			This.SelLength = Len(Rtrim(This.DisplayValue))
			This.csearchstring = ""
		ENDIF
		
		*** CAUTARE "CONTINE" DACA SE APASA CTRL+ENTER
		If This.RowSourceType = 3 .And. .Not. Inlist(nkeycode, 5, 24, 13, 54) && FARA SAGETI
		*!*		If .Not. Empty(This.prowsource)
		*!*			This.RowSource = This.prowsource
		*!*			This.prowsource = ""
		*!*			This.Requery()
		*!*		Endif
			If nkeycode = 10 && CTRL+ENTER => SELECTIA CONTINE CUVANTUL CHEIE IN LOC DE INCEPE CU
				Nodefault
		
				This.prowsource = This.RowSource
				this.RowSource = ""
				This.RefreshData(2) && cautare contine
				llQueried = .T.
				this.RowSource = This.prowsource
				This.prowsource = ""
				This.csearchstring = ""
				
				Keyboard '{ALT + DNARROW}'
				Return
			Endif
		Endif
		If Inlist(nkeycode, 6) .Or. (Inlist(nkeycode, 52, 54) .And. Bitand(1, nshiftaltctrl) == 1) .Or. (Inlist(2, 26) .And. Bitand(2, nshiftaltctrl) == 2)
			Return
		Endif
		Select (This.pcursorname)
		lnrecno = Recno()
		
		*** TRATARE SAGETI, DEL, BACKSPACE
		Do Case
			Case nkeycode = 4 && RIGHT ARROW
				This.csearchstring = Left(This.csearchstring, This.SelStart) + Substr(This.DisplayValue, This.SelStart + 1, 1)
				m.lnSelStart = This.SelStart + 1
			Case nkeycode = 19 && LEFT ARROW
				This.csearchstring = Left(This.csearchstring, This.SelStart - 1)
				m.lnSelStart = This.SelStart - 1
				This.SelLength = Max(Len(Rtrim(This.DisplayValue)) - m.lnSelStart, 0)
				If m.lnSelStart < 0
					Return
				Endif
			Case nkeycode = 7 && DEL
				If This.SelStart = 0
					This.csearchstring = ""
					This.DisplayValue = ""
				Else
					This.csearchstring = Left(This.csearchstring, This.SelStart) + Right(This.csearchstring, Len(This.csearchstring) - This.SelStart - 1)
					This.DisplayValue = This.csearchstring
				Endif
				m.lnSelStart = Len(This.csearchstring)
			Case nkeycode = 127 && BACKSPACE
				If This.SelStart = 0
					This.csearchstring = ""
					This.DisplayValue = ""
				Else
					This.csearchstring = Left(This.csearchstring, This.SelStart - 1) + Right(This.csearchstring, Len(This.csearchstring) - This.SelStart)
					This.DisplayValue = This.csearchstring
					m.lnSelStart = Len(This.csearchstring)
				Endif
			Case nkeycode = 24 && DOWN ARROW
				If .Not. Eof()
					Skip
				Endif
				If Eof()
					Goto Bottom
				Endif
			Case nkeycode = 5 && UP ARROW
				If .Not. Bof()
					Skip -1
				Endif
				If Bof()
					Goto Top
				Endif
			Case Between(nkeycode, 32, 126) .Or. Between(nkeycode, 97, 122) .Or. Between(nkeycode, 48, 57)
				If This.SelStart = 0 .And. This.SelLength > 1
					This.csearchstring = Upper(Chr(nkeycode))
				Else
					This.csearchstring = Left(This.csearchstring, This.SelStart) + Upper(Chr(nkeycode)) + Right(This.csearchstring, Len(This.csearchstring) - This.SelStart)
				Endif
				m.lnSelStart = This.SelStart + 1
			Otherwise
				Return
		Endcase
		NODEFAULT
		
		*** CAUTARE "INCEPE CU"
		msemafor = 0
		If nkeycode <> 4 .And. nkeycode <> 19 .And. nkeycode <> 5 .And. nkeycode <> 24 .And. .Not. Empty(This.csearchstring)
			* Execut cautarea INCEPE CU pe serverul baza de date, daca nu cumva am facut cautarea deja CONTINE la CTRL+ENTER This.Requery(2)
			IF !m.llQueried && AND m.lcSearchString <> this.cSearchString
				This.prowsource = This.RowSource
				this.RowSource = ""
				This.RefreshData(1) && cautare incepe cu...
				this.RowSource = this.pRowSource
				This.prowsource = ""
			ENDIF 
		
			* Verific daca textul cautat este in inregistrarile selectate (daca am rezultate in cursor)
			SELECT (this.pCursorName)
			Locate For Upper(Evaluate(This.pfieldactiv)) = Upper(This.csearchstring)
			If .Not. Found()
				If .Not. Empty(This.pSecondField)
					Locate For Evaluate(This.pSecondField) = Upper(This.csearchstring) + " " .Or. Evaluate(This.pSecondField) = "RO" + Upper(This.csearchstring) + " "
					If .Not. Found()
						Locate For Evaluate(This.pSecondField) = Upper(This.csearchstring) .Or. Evaluate(This.pSecondField) = "RO" + Upper(This.csearchstring)
					Endif
					If Found()
						msemafor = 3
					Else
						msemafor = 2
					Endif
				Else
					msemafor = 2
				Endif
			Else
				msemafor = 1
			Endif
		ENDIF
		
		SELECT (this.pCursorName)
		If nkeycode <> 7 .And. nkeycode <> 127 .And. nkeycode <> 4 .And. nkeycode <> 19
			If (Empty(This.csearchstring) .Or. msemafor = 2) .And. nkeycode <> 5 .And. nkeycode <> 24
				If lnrecno > Reccount()
					Goto Top
				Else
					Goto lnrecno
				Endif
				If .Not. This.llimittolist
					This.DisplayValue = This.csearchstring
				Else
					This.csearchstring = m.lcSearchString
				Endif
			Else
				If msemafor = 1 .Or. nkeycode = 5 .Or. nkeycode = 24
					This.DisplayValue = Evaluate(This.pfieldactiv)
				Endif
				If msemafor = 3
					This.DisplayValue = Evaluate(This.pSecondField)
				Endif
			Endif
		Endif
		This.SelStart = Max(m.lnSelStart, 0)
		If Txtwidth(Rtrim(This.DisplayValue), This.FontName, This.FontSize) * Fontmetric(6, This.FontName, This.FontSize) < This.Width - 15
			This.SelLength = Max(Len(Rtrim(This.DisplayValue)) - Len(Rtrim(This.csearchstring)), 0)
		Else
			This.SelLength = 0
		Endif
		
	ENDPROC

	PROCEDURE LostFocus
		*!*	If  .Not. Empty(This.prowsource)
		*!*		This.RowSource = This.prowsource
		*!*		This.prowsource = ""
		*!*		This.Requery()
		*!*	Endif
		If  .Not. Empty(This.pSecondField)
			Select (This.pcursorname)
		
			If This.DisplayValue =  EVALUATE(This.pSecondField) .Or. "RO" + this.DisplayValue =  EVALUATE(This.pSecondField)
				This.DisplayValue = Evaluate(This.pfieldactiv)
			Endif
		Endif
		This.csearchstring = ""
		This.SelStart = 0
		
	ENDPROC

	PROCEDURE refreshdata
		Lparameters tnTip
		
		Local lnTip, lcSourceOrder, lcSourceSql, lcSourceWhere, lcSql, lnHandle, llSucces, lcCursor
		Private pcValue
		pcValue = ''
		lnTip = Iif(Type('tnTip') = 'N', m.tnTip, 0)
		
		If m.lnTip <> 0 AND Len(Alltrim(This.cSearchString)) <= This.nCharCountBegin
			Return
		Endif
		
		lcSourceSql = This.cSourceSql
		lcWhereFirst = This.pFieldActiv + " like ?pcValue"
		lcWhereSecond = Iif(!Empty(This.pSecondField), This.pSecondField + " like ?pcValue", "")
		lcSourceWhere = [ where ] + Iif(!Empty(This.cSourceWhere), [(] + This.cSourceWhere + [)], []) + [ and (] + m.lcWhereFirst + Iif(!Empty(m.lcWhereSecond), [ or ] + m.lcWhereSecond, []) + [)]
		lcSourceOrder = " order by " + Iif(!Empty(This.cSourceOrder), This.cSourceOrder, This.pFieldActiv)
		Do Case
			Case m.lnTip = 0 && INIT
				lcSourceWhere = [ where 1=2]
				lcSourceOrder = ""
			Case m.lnTip = 1 && CAUTARE INCEPE CU
				pcValue = This.cSearchString + '%'
			Case m.lnTip = 2 && CAUTARE CONTINE
				pcValue = '%' + This.cSearchString + '%'
		ENDCASE
		
		lcCursor = 's' + This.pCursorName
		lcSql = m.lcSourceSql + m.lcSourceWhere + m.lcSourceOrder
		
		WAIT WINDOW 'RefreshData ' + m.lcSql NOWAIT 
		llSucces = This.SelectData(m.lcSql, m.lcCursor)
		Return m.llSucces
		
	ENDPROC

	PROCEDURE selectdata
		Lparameters tcSql, tcCursor
		
		Local llSucces
		WAIT WINDOW 'Sql: ' + m.tcSql + ' cursor: ' + m.tcCursor + IIF(TYPE('pcValue') = 'C', ' pcValue: ' + m.pcValue, '') NOWAIT 
		llSucces = goExecutor.oExecuta(m.tcSql, m.tcCursor)
		
		Return m.llSucces
		
	ENDPROC

ENDDEFINE
