LPARAMETERS pcalias, pcsoubor, pcvzordocplus,llformatovat,lcjazyk, ajceny, ajnakup, skadial, ajmnozstva, ajpoznamky, cenalimitu
LOCAL lcvzordoc, lnvzortyp, lcpoznmem, lnselect
LOCAL qdatumod, qdatumdo, qtxtdatum, qsetdate, qjedenden, qriadok
m.llformatovat=.t.
IF !OOoIsInstalled()
	=MESSAGEBOX("Open Office nie je nainštalovaný.",64,"FoodMan")
	RETURN
ENDIF
IF EMPTY(m.ajmnozstva)
	m.ajmnozstva=.F.
ELSE
	m.ajmnozstva=.T.
ENDIF 
IF EMPTY(m.ajpoznamky)
	m.ajpoznamky=.F.
ELSE
	m.ajpoznamky=.T.
ENDIF 
IF EMPTY(cenalimitu)
	m.cenalimitu=.f.
ELSE
	m.cenalimitu=.t.
	m.ajceny=.f.
	m.ajnakup=.f.
ENDIF 
********  Contents of OpenOffice.h
* http://api.openoffice.org/docs/common/ref/com/sun/star/awt/FontUnderline.html
#DEFINE com_sun_star_awt_FontUnderline_NONE            0
#DEFINE com_sun_star_awt_FontUnderline_SINGLE          1
#DEFINE com_sun_star_awt_FontUnderline_DOUBLE          2
#DEFINE com_sun_star_awt_FontUnderline_DOTTED          3
#DEFINE com_sun_star_awt_FontUnderline_DONTKNOW        4
#DEFINE com_sun_star_awt_FontUnderline_DASH            5
#DEFINE com_sun_star_awt_FontUnderline_LONGDASH        6
#DEFINE com_sun_star_awt_FontUnderline_DASHDOT         7
#DEFINE com_sun_star_awt_FontUnderline_DASHDOTDOT      8
#DEFINE com_sun_star_awt_FontUnderline_SMALLWAVE       9
#DEFINE com_sun_star_awt_FontUnderline_WAVE           10
#DEFINE com_sun_star_awt_FontUnderline_DOUBLEWAVE     11
#DEFINE com_sun_star_awt_FontUnderline_BOLD           12
#DEFINE com_sun_star_awt_FontUnderline_BOLDDOTTED     13
#DEFINE com_sun_star_awt_FontUnderline_BOLDDASH       14
#DEFINE com_sun_star_awt_FontUnderline_BOLDLONGDASH   15
#DEFINE com_sun_star_awt_FontUnderline_BOLDDASHDOT    16
#DEFINE com_sun_star_awt_FontUnderline_BOLDDASHDOTDOT 17
#DEFINE com_sun_star_awt_FontUnderline_BOLDWAVE       18

* http://api.openoffice.org/docs/common/ref/com/sun/star/awt/FontWeight.html#ConstantDetails
#DEFINE com_sun_star_awt_FontWeight_DONTKNOW     0
#DEFINE com_sun_star_awt_FontWeight_THIN        50
#DEFINE com_sun_star_awt_FontWeight_ULTRALIGHT  60
#DEFINE com_sun_star_awt_FontWeight_LIGHT       75
#DEFINE com_sun_star_awt_FontWeight_SEMILIGHT   90
#DEFINE com_sun_star_awt_FontWeight_NORMAL     100
#DEFINE com_sun_star_awt_FontWeight_SEMIBOLD   110
#DEFINE com_sun_star_awt_FontWeight_BOLD       150
#DEFINE com_sun_star_awt_FontWeight_ULTRABOLD  175
#DEFINE com_sun_star_awt_FontWeight_BLACK      200

*  http://api.openoffice.org/docs/common/ref/com/sun/star/awt/TextAlign.html
#Define com_sun_star_awt_TextAlign_Left   0
#Define com_sun_star_awt_TextAlign_Center 1
#Define com_sun_star_awt_TextAlign_Right  2


#Define com_sun_star_style_ParagraphAdjust_LEFT    0
#Define com_sun_star_style_ParagraphAdjust_RIGHT   1
#Define com_sun_star_style_ParagraphAdjust_BLOCK   2
#Define com_sun_star_style_ParagraphAdjust_CENTER  3
#Define com_sun_star_style_ParagraphAdjust_STRETCH 0


* http://api.openoffice.org/docs/common/ref/com/sun/star/embed/ElementModes.html#Constants
#DEFINE com_sun_star_embed_ElementModes_READ          1
#DEFINE com_sun_star_embed_ElementModes_SEEKABLE      2
#DEFINE com_sun_star_embed_ElementModes_SEEKABLEREAD  3
#DEFINE com_sun_star_embed_ElementModes_WRITE         4
#DEFINE com_sun_star_embed_ElementModes_READWRITE     7
#DEFINE com_sun_star_embed_ElementModes_TRUNCATE      8
#DEFINE com_sun_star_embed_ElementModes_NOCREATE     16

* http://api.openoffice.org/docs/common/ref/com/sun/star/text/ControlCharacter.html
#DEFINE com_sun_star_text_ControlCharacter_PARAGRAPH_BREAK  0
#DEFINE com_sun_star_text_ControlCharacter_LINE_BREAK       1
#DEFINE com_sun_star_text_ControlCharacter_HARD_HYPHEN      2
#DEFINE com_sun_star_text_ControlCharacter_SOFT_HYPHEN      3
#DEFINE com_sun_star_text_ControlCharacter_HARD_SPACE       4
#DEFINE com_sun_star_text_ControlCharacter_APPEND_PARAGRAPH 5



***   added using OOConstants program
#DEFINE com_sun_star_style_TabAlign_LEFT    0
#DEFINE com_sun_star_style_TabAlign_CENTER  1
#DEFINE com_sun_star_style_TabAlign_RIGHT   2
#DEFINE com_sun_star_style_TabAlign_DECIMAL 3
#DEFINE com_sun_star_style_TabAlign_DEFAULT 4

#DEFINE com_sun_star_awt_FontSlant_NONE            0
#DEFINE com_sun_star_awt_FontSlant_OBLIQUE         1
#DEFINE com_sun_star_awt_FontSlant_ITALIC          2
#DEFINE com_sun_star_awt_FontSlant_DONTKNOW        3
#DEFINE com_sun_star_awt_FontSlant_REVERSE_OBLIQUE 4
#DEFINE com_sun_star_awt_FontSlant_REVERSE_ITALIC  5

#DEFINE com_sun_star_text_PageNumberType_PREV    0
#DEFINE com_sun_star_text_PageNumberType_CURRENT 1
#DEFINE com_sun_star_text_PageNumberType_NEXT    2

qsetdate=SET("date")
lnselect = SELECT()
lcvzordoc = IIF(VARTYPE(pcvzordocplus)='C', ALLTRIM(pcvzordocplus), "Vzor_1")
m.lnvzortyp=6

ooopen = OOoGetServiceManager()
*ooopen =CreateObject("com.sun.star.ServiceManager")
m.ooDesktop=OOoGetDesktop()
*m.ooDesktop= ooopen.createInstance("com.sun.star.frame.Desktop")
m.oosubor=oooopenfile(m.skadial+lcvzordoc+".doc")


m.cislostylu=0
Families = oosubor.getStyleFamilies
ParaStyles = Families.getByName("ParagraphStyles")
MenaStylov = parastyles.getelementnames()

FOR m.i=1 TO ALEN(MenaStylov) &&parastyles.count()
	IF MenaStylov(m.i)="Limit_Hlavicka"
		m.cislostylu=m.i
		oheaderstyle=ParaStyles.getbyname("Limit_Hlavicka")
		EXIT
	ENDIF
ENDFOR

*!*	oStyleFamilies = oDocument.StyleFamilies
*!*	oParagraphStyles = oStyleFamilies.getByName("ParagraphStyles")
*!*	oStyle = _
*!*	oDocument.createInstance("com.sun.star.style.ParagraphStyle")
*!*	oParagraphStyles.insertByName("myheading",oStyle)
*!*	oStyle.Name = "myheading"
*!*	oStyle.CharFontName = "Helvetica"
*!*	oStyle.CharHeight = 36
*!*	oStyle.CharWeight = com.sun.star.awt.FontWeight.BOLD
*!*	oStyle.CharAutoKerning = .t.
*!*	oStyle.ParaAdjust = _
*!*	com.sun.star.style.ParagraphAdjust.LEFT
*!*	oStyle.ParaFirstLineIndent = 0
*!*	oStyle.breakType = _
*!*	com.sun.star.style.BreakType.PAGE_BEFORE
*!*	oCursor.gotoStart(.f.)
*!*	oCursor.gotoEndOfParagraph(.t.)
*!*	oCursor.paraStyle = "myheading"
IF m.cislostylu=0
	oheaderstyle = oosubor.createInstance("com.sun.star.style.ParagraphStyle")
	oheaderstyle.ParentStyle = "Heading 1"
	ParaStyles.insertByName("Limit_Hlavicka", oheaderstyle)
	oheaderstyle.Name="Limit_Hlavicka"
	oheaderstyle.CharFontName = "Times New Roman"
	oheaderstyle.CharHeight = 20
	oheaderstyle.CharWeight = com_sun_star_awt_FontWeight_BOLD
	oheaderstyle.CharAutoKerning = .t.
	oheaderstyle.ParaAdjust = com_sun_star_style_ParagraphAdjust_LEFT
	oheaderstyle.ParaTopMargin = 1000
ENDIF
WITH oheaderstyle
	.ParaFirstLineIndent = 12
	IF INLIST(lnvzortyp, 6) AND m.cislostylu=0
		.CharFontName = "Calibri"
		IF  .NOT. llformatovat
			.CharHeight = 14
			.CharWeight = com_sun_star_awt_FontWeight_NORMAL
		ELSE
			.CharHeight = 12
			.CharWeight = com_sun_star_awt_FontWeight_BOLD
		ENDIF
	ENDIF
ENDWITH
ParaStyles = Families.getByName("ParagraphStyles")
MenaStylov = parastyles.getelementnames()
m.cislostylu=0
FOR m.i=1 TO ALEN(MenaStylov) &&parastyles.count()
	IF MenaStylov(m.i)="Limit_Hlavicka2"
		m.cislostylu=m.i
		oheaderstyle2=ParaStyles.getbyname("Limit_Hlavicka2")
		EXIT
	ENDIF
ENDFOR
IF m.cislostylu=0
	oheaderstyle2 = oosubor.createInstance("com.sun.star.style.ParagraphStyle")
	oheaderstyle2.ParentStyle = "Normal"
	ParaStyles.insertByName("Limit_Hlavicka2", oheaderstyle2)
	oheaderstyle2.Name="Limit_Hlavicka2"
	oheaderstyle2.CharFontName = "Times New Roman"
	oheaderstyle2.CharHeight = 20
	oheaderstyle2.CharWeight = com_sun_star_awt_FontWeight_BOLD
	oheaderstyle2.CharAutoKerning = .t.
	oheaderstyle2.ParaAdjust = com_sun_star_style_ParagraphAdjust_LEFT
	oheaderstyle2.ParaTopMargin = 1000
ENDIF
WITH oheaderstyle2
	IF INLIST(lnvzortyp, 6) AND m.cislostylu=0
		.CharFontName = "Calibri"
		IF  .NOT. llformatovat
			.CharHeight = 14
			.CharWeight = com_sun_star_awt_FontWeight_NORMAL
		ELSE
			.CharHeight = 12
			.CharWeight = com_sun_star_awt_FontWeight_NORMAL
		ENDIF
	ENDIF
ENDWITH
ParaStyles = Families.getByName("ParagraphStyles")
MenaStylov = parastyles.getelementnames()
m.cislostylu=0
FOR m.i=1 TO ALEN(MenaStylov) &&parastyles.count()
	IF MenaStylov(m.i)="Limit_Druhy"
		m.cislostylu=m.i
		otitlestyle=ParaStyles.getbyname("Limit_Druhy")
		EXIT
	ENDIF
ENDFOR
IF m.cislostylu=0
	otitlestyle = oosubor.createInstance("com.sun.star.style.ParagraphStyle")
	otitlestyle.ParentStyle = "Normal"
	ParaStyles.insertByName("Limit_Druhy", otitlestyle)
	otitlestyle.Name="Limit_Druhy"
	otitlestyle.CharFontName = "Times New Roman"
	otitlestyle.CharHeight = 14
	otitlestyle.CharWeight = com_sun_star_awt_FontWeight_NORMAL
	otitlestyle.CharAutoKerning = .t.
	otitlestyle.ParaAdjust = com_sun_star_style_ParagraphAdjust_LEFT
	otitlestyle.ParaTopMargin = 1000
ENDIF
WITH otitlestyle
	IF m.cislostylu=0
		IF  .NOT. llformatovat
			.parentstyle = "Normal"
		ELSE
			.parentstyle = "Heading 2"
			.ParaTopMargin = 1000
			.ParaBottomMargin = 1000
		ENDIF
		IF INLIST(lnvzortyp, 6)
			.CharFontName = "Calibri"
			IF  .NOT. llformatovat
				.CharPosture = com_sun_star_awt_FontSlant_NONE
				.CharHeight = 14
				.CharWeight = com_sun_star_awt_FontWeight_NORMAL
			ELSE
				.CharHeight = 12
				.CharPosture = com_sun_star_awt_FontSlant_ITALIC
				.CharWeight = com_sun_star_awt_FontWeight_BOLD
			ENDIF
		ENDIF
	ENDIF 
ENDWITH
ParaStyles = Families.getByName("ParagraphStyles")
MenaStylov = parastyles.getelementnames()
m.cislostylu=0
FOR m.i=1 TO ALEN(MenaStylov) &&parastyles.count()
	IF MenaStylov(m.i)="Limit_Polozky"
		m.cislostylu=m.i
		obodystyle=ParaStyles.getbyname("Limit_Polozky")
		EXIT
	ENDIF
ENDFOR
IF m.cislostylu=0
	obodystyle = oosubor.createInstance("com.sun.star.style.ParagraphStyle")
	obodystyle.ParentStyle = "Normal"
	ParaStyles.insertByName("Limit_Polozky", obodystyle)
	obodystyle.Name="Limit_Polozky"
	obodystyle.CharFontName = "Times New Roman"
	obodystyle.CharHeight = 14
	obodystyle.CharWeight = com_sun_star_awt_FontWeight_NORMAL
	obodystyle.CharAutoKerning = .t.
	obodystyle.ParaAdjust = com_sun_star_style_ParagraphAdjust_LEFT
	obodystyle.ParaTopMargin = 1000
ENDIF
WITH obodystyle
*!*		IF llformatovat
*!*			.paragraphformat.paralinespacing = 14
*!*		ENDIF
	IF INLIST(lnvzortyp, 6) AND m.cislostylu=0
		.CharFontName = "Calibri"
	ENDIF 
ENDWITH
ParaStyles = Families.getByName("ParagraphStyles")
MenaStylov = parastyles.getelementnames()
m.cislostylu=0
FOR m.i=1 TO ALEN(MenaStylov) &&parastyles.count()
	IF MenaStylov(m.i)="Limit_Sucty_Bold"
		m.cislostylu=m.i
		ototalstyle=ParaStyles.getbyname("Limit_Sucty_Bold")
		EXIT
	ENDIF
ENDFOR
IF m.cislostylu=0
	ototalstyle = oosubor.createInstance("com.sun.star.style.ParagraphStyle")
	ototalstyle.ParentStyle = "Normal"
	ParaStyles.insertByName("Limit_Sucty_Bold", ototalstyle)
	ototalstyle.Name="Limit_Sucty_Bold"
	ototalstyle.CharFontName = "Times New Roman"
	ototalstyle.CharHeight = 14
	ototalstyle.CharWeight = com_sun_star_awt_FontWeight_BOLD
	ototalstyle.CharAutoKerning = .t.
	ototalstyle.ParaAdjust = com_sun_star_style_ParagraphAdjust_LEFT
	ototalstyle.ParaTopMargin = 1000
ENDIF
WITH ototalstyle
	IF INLIST(lnvzortyp, 6) AND m.cislostylu=0
		.CharFontName = "Calibri"
		IF  .NOT. llformatovat
			.CharHeight = 14
			.CharWeight = com_sun_star_awt_FontWeight_NORMAL
		ELSE
			.CharHeight = 14
			.CharWeight = com_sun_star_awt_FontWeight_BOLD
		ENDIF
	ENDIF
ENDWITH
ParaStyles = Families.getByName("ParagraphStyles")
MenaStylov = parastyles.getelementnames()
m.cislostylu=0
FOR m.i=1 TO ALEN(MenaStylov) &&parastyles.count()
	IF MenaStylov(m.i)="Limit_Sucty_BezBoldu"
		m.cislostylu=m.i
		ototalstyle2=ParaStyles.getbyname("Limit_Sucty_BezBoldu")
		EXIT
	ENDIF
ENDFOR
IF m.cislostylu=0
	ototalstyle2 = oosubor.createInstance("com.sun.star.style.ParagraphStyle")
	ototalstyle2.ParentStyle = "Normal"
	ParaStyles.insertByName("Limit_Sucty_BezBoldu", ototalstyle2)
	ototalstyle2.Name="Limit_Sucty_BezBoldu"
	ototalstyle2.CharFontName = "Times New Roman"
	ototalstyle2.CharHeight = 14
	ototalstyle2.CharWeight = com_sun_star_awt_FontWeight_NORMAL
	ototalstyle2.CharAutoKerning = .T.
	ototalstyle2.ParaAdjust = com_sun_star_style_ParagraphAdjust_LEFT
	ototalstyle2.ParaTopMargin = 1000
ENDIF
WITH ototalstyle2
	IF  INLIST(lnvzortyp, 6) AND m.cislostylu=0
		.CharFontName = "Calibri"
		IF  .NOT. llformatovat
			.CharHeight = 14
			.CharWeight = com_sun_star_awt_FontWeight_NORMAL
		ELSE
			.CharHeight = 14
			.CharWeight = com_sun_star_awt_FontWeight_NORMAL
		ENDIF
	ENDIF
ENDWITH
SELECT llist5
REPLACE dan WITH 1 FOR dan=0
SUM ALL cena_prod*mnozstvi TO m.lncena0
TRY 
	SUM ALL cena_prod*mnozstvi/dan TO m.lncena4
CATCH
	m.lncena4=0
ENDTRY 
SELECT (pcalias)
GOTO TOP
lcpoznmem = rlimit.poznamka
lnprira = MTON(rlimit.zlava)
lnprirb = rlimit.typ_zlavy
DO CASE
	CASE lnprirb="A"
		m.lnsl_p=lnprira
	CASE lnprirb="P"
		IF m.slovenskaverzia
			m.lnsl_p=ROUND(lnprira/100*m.lncena0,2)
		ELSE
			m.lnsl_p=ROUND(lnprira/100*m.lncena0,0)
		ENDIF
	OTHERWISE
		m.lnprira=0
		m.lnsl_p=0
ENDCASE
m.lnsl_p=MTON(m.lnsl_p)
lncena2 = MTON(lncena0-lnsl_p)
lncena3 = MTON(IIF(m.lncena0=0,0,m.lncena2/m.lncena0*m.lncena4))
IF !m.slovenskaverzia
	m.lncena3=ROUND(m.lncena3,0)
ENDIF
IF m.lnvzortyp=6
	IF !EMPTY(rlimit.firma)
		pozn1=ALLTRIM(rlimit.firma)
	ELSE
		pozn1=IIF(EMPTY(rlimit.txt1),rlimit.menolimit,rlimit.txt1)
	ENDIF
ELSE
	pozn1=IIF(EMPTY(rlimit.txt1),rlimit.menolimit,rlimit.txt1)
ENDIF
pozn2=rlimit.txt2
pozn4=0
m.menolimit=rlimit.menolimit
rok=YEAR(llist5.datum)
m.filt=SET("filter")
SELECT DISTINCT llist5.datum, llist5.chod, llist5.limit, llist5.pocet, llist5.por1, llist5.txt1, llist5.txt2 FROM llist5  ORDER BY datum, por1 INTO CURSOR aaasss WHERE &filt
SELECT aaasss
IF m.cenalimitu
	SUM limit*pocet TO m.lncena0
	m.lncena2=m.lncena0
	m.lncena3=m.lncena0
	m.lncena4=m.lncena0
ENDIF 
GO TOP
m.qdatumod=aaasss.datum
GO BOTTOM
m.qdatumdo=aaasss.datum
GO TOP
m.qjedenden=(m.qdatumod=m.qdatumdo)

orange=oosubor.getText() && Create text object
loCursor= orange.createTextCursor()
loCursor.gotoStart(.f.)
loCursor.gotoEndOfParagraph(.T.)
loCursor.ParaStyleName = "Limit_Hlavicka"


IF m.lnvzortyp=6
	SET DATE TO LONG
	m.qtxtdatum=IIF(m.qjedenden,DTOC(m.qdatumod), DTOC(m.qdatumod)+" "+DTOC(m.qdatumdo))
	WITH orange
		orange.insertstring(loCursor,"Firma:"+CHR(9)+m.pozn1+CHR(10),.F.)
		DO CASE
			CASE lcjazyk=='A'
				orange.insertstring(loCursor,"Date:"+CHR(9)+m.qtxtdatum+CHR(10),.F.)
				orange.insertstring(loCursor,"Time:"+CHR(9)+"Viz níže"+CHR(10),.F.)
				orange.insertstring(loCursor,"Place:"+CHR(9)+ALLTRIM(pozn2)+CHR(10),.F.)
				orange.insertstring(loCursor,"Persons:"+CHR(9)+TRANSFORM(aaasss.pocet)+CHR(10),.F.)
			CASE lcjazyk=='N'
				orange.insertstring(loCursor,"Tag:"+CHR(9)+m.qtxtdatum+CHR(10),.F.)
				orange.insertstring(loCursor,"Zeit:"+CHR(9)+"Viz níže"+CHR(10),.F.)
				orange.insertstring(loCursor,"Platz:"+CHR(9)+ALLTRIM(pozn2)+CHR(10),.F.)
				orange.insertstring(loCursor,"Nummer:"+CHR(9)+TRANSFORM(aaasss.pocet)+CHR(10),.F.)
			OTHERWISE
				orange.insertstring(loCursor,jaz("form datum")+":"+CHR(9)+m.qtxtdatum+CHR(10),.F.)
				orange.insertstring(loCursor,jaz("rep_cas")+":"+CHR(9)+"Viz níže"+CHR(10),.F.)
				orange.insertstring(loCursor,jaz("word_miesto")+":"+CHR(9)+ALLTRIM(pozn2)+CHR(10),.F.)
				orange.insertstring(loCursor,jaz("rep_pocet_osob")+":"+CHR(9)+TRANSFORM(aaasss.pocet)+CHR(10),.F.)
		ENDCASE
		orange.insertstring(loCursor,CHR(10),.f.)
	ENDWITH
ENDIF
SELECT aaasss

m.qriadok=0
SCAN ALL
	SCATTER MEMVAR FIELDS datum, chod
	m.str_nazev=ALLTRIM(aaasss.chod)
	m.poc_osob=aaasss.pocet
	m.pozn4=aaasss.limit

	IF m.qriadok=0
		orange.insertString(loCursor,CHR(10),.f.)
		m.qriadok=1
	ELSE
		orange.insertString(loCursor,"***************************************************************************************"+CHR(10),.F.)
		orange.insertString(loCursor,CHR(10),.f.)
	ENDIF
	DO CASE 
		CASE INLIST(lnvzortyp, 6)
			loCursor.collapseToEnd()
			orange.insertControlCharacter(loCursor, com_sun_star_text_ControlCharacter_PARAGRAPH_BREAK, .f.)
			orange.insertControlCharacter(loCursor, com_sun_star_text_ControlCharacter_APPEND_PARAGRAPH, .f.)
			loCursor.gotoStartOfParagraph(.f.)
			loCursor.gotoEndOfParagraph(.T.)
			loCursor.ParaStyleName = "Limit_Hlavicka2"
			orange.insertString(loCursor,m.str_nazev+CHR(10),.F.)
	ENDCASE
	loCursor.collapseToEnd()
	orange.insertControlCharacter(loCursor, com_sun_star_text_ControlCharacter_PARAGRAPH_BREAK, .f.)
	orange.insertControlCharacter(loCursor, com_sun_star_text_ControlCharacter_APPEND_PARAGRAPH, .f.)
	loCursor.gotoStartOfParagraph(.f.)
	loCursor.gotoEndOfParagraph(.T.)
	loCursor.ParaStyleName = "Limit_Hlavicka2"
	DO CASE
		CASE INLIST(lnvzortyp, 6)
			m.qtxtdatum=DTOC(aaasss.datum)
			DO CASE
				CASE lcjazyk=='A'
					IF !EMPTY(aaasss.txt1)
						orange.insertstring(loCursor,ALLTRIM(aaasss.txt1)+CHR(10),.F.)
					ENDIF
					IF !m.qjedenden
						orange.insertstring(loCursor,"Date:"+CHR(9)+m.qtxtdatum+CHR(10),.F.)
					ENDIF
					IF !EMPTY(aaasss.txt2)
						orange.insertstring(loCursor,"Place:"+CHR(9)+ALLTRIM(aaasss.txt2)+CHR(10),.F.)
					ENDIF
					orange.insertstring(loCursor,"Persons:"+CHR(9)+TRANSFORM(poc_osob)+CHR(10),.F.)
					IF  .NOT. EMPTY(pozn4)
						orange.insertstring(loCursor,"Limit:"+CHR(9)+ALLTRIM(STR(pozn4,10,2))+CHR(10),.F.)
					ENDIF
					IF  .NOT. EMPTY(llist5.pozn_ext)
						orange.insertstring(loCursor,"Notice:"+CHR(9)+ALLTRIM(llist5.pozn_ext)+CHR(10),.F.)
					ENDIF
				CASE lcjazyk=='N'
					IF !EMPTY(aaasss.txt1)
						orange.insertstring(loCursor,ALLTRIM(aaasss.txt1)+CHR(10),.F.)
					ENDIF
					IF !m.qjedenden
						orange.insertstring(loCursor,"Tag:"+CHR(9)+m.qtxtdatum+CHR(10),.F.)
					ENDIF
					IF !EMPTY(aaasss.txt2)
						orange.insertstring(loCursor,"Platz:"+CHR(9)+ALLTRIM(aaasss.txt2)+CHR(10),.F.)
					ENDIF
					orange.insertstring(loCursor,"Nummer:"+CHR(9)+TRANSFORM(poc_osob)+CHR(10),.F.)
					IF  .NOT. EMPTY(pozn4)
						orange.insertstring(loCursor,"Limit:"+CHR(9)+ALLTRIM(STR(pozn4,10,2))+CHR(10),.F.)
					ENDIF
					IF  .NOT. EMPTY(llist5.pozn_ext)
						orange.insertstring(loCursor,"Note:"+CHR(9)+ALLTRIM(llist5.pozn_ext)+CHR(10),.F.)
					ENDIF
				OTHERWISE
					IF !EMPTY(aaasss.txt1)
						orange.insertstring(loCursor,ALLTRIM(aaasss.txt1)+CHR(10),.F.)
					ENDIF
					IF !m.qjedenden
						orange.insertstring(loCursor,jaz("form datum")+":"+CHR(9)+m.qtxtdatum+CHR(10),.F.)
					ENDIF
					IF !EMPTY(aaasss.txt2)
						orange.insertstring(loCursor,jaz("word_miesto")+":"+CHR(9)+ALLTRIM(aaasss.txt2)+CHR(10),.F.)
					ENDIF
					orange.insertstring(loCursor,"Počet osob:"+CHR(9)+TRANSFORM(poc_osob)+CHR(10),.F.)
					IF  .NOT. EMPTY(pozn4)
						orange.insertstring(loCursor,"Limit:"+CHR(9)+ALLTRIM(STR(pozn4,10,2))+CHR(10),.F.)
					ENDIF
					IF  .NOT. EMPTY(llist5.pozn_ext)
						orange.insertstring(loCursor,"Poznámka:"+CHR(9)+ALLTRIM(llist5.pozn_ext)+CHR(10),.F.)
					ENDIF
			ENDCASE
	ENDCASE
	orange.insertstring(loCursor,CHR(10),.f.)
	LOCAL m.lcdruh
	m.lcdruh = "QQQQQQQQQQQQQQQQQQQQQ"
	SELECT llist5
	loCursor.collapseToEnd()
	orange.insertControlCharacter(loCursor, com_sun_star_text_ControlCharacter_PARAGRAPH_BREAK, .f.)
	orange.insertControlCharacter(loCursor, com_sun_star_text_ControlCharacter_APPEND_PARAGRAPH, .f.)
	loCursor.gotoStartOfParagraph(.f.)
	loCursor.gotoEndOfParagraph(.T.)
	loCursor.ParaStyleName = "Limit_Polozky"
	SCAN FOR datum=m.datum .AND. chod=m.chod &&.AND. id_man=m.id_man
		IF  llist5.druhy<>m.lcdruh
			IF  .NOT. llformatovat
				orange.insertstring(loCursor,CHR(10),.f.)
			ENDIF
			orange.insertstring(loCursor,ALLTRIM(llist5.druhy)+CHR(10),.F.)
			lcdruh=llist5.druhy
		ENDIF
		DO CASE
			CASE INLIST(lnvzortyp, 6)
				orange.insertstring(loCursor,IIF(!m.ajmnozstva,"",IIF(MTON(llist5.mnozstvi)=INT(MTON(llist5.mnozstvi)), STR(MTON(llist5.mnozstvi),7,0)+" x ", STR(MTON(llist5.mnozstvi), 7, 2)+" x "))+RTRIM(llist5.meno)+CHR(9)+IIF(m.ajceny,"á"+CHR(9)+ALLTRIM(STR(llist5.cena_prod,12,2))+CHR(9)+"="+CHR(9)+ALLTRIM(STR(llist5.cena_prod*llist5.mnozstvi,12,2)),IIF(!m.ajpoznamky,"",IIF(EMPTY(llist5.poznamka),""," - "+ALLTRIM(llist5.poznamka))))+CHR(10),.F.)
		ENDCASE
	ENDSCAN
	SELECT aaasss
ENDSCAN
USE IN aaasss
orange.insertstring(loCursor,CHR(10),.f.)

loCursor.collapseToEnd()
orange.insertControlCharacter(loCursor, com_sun_star_text_ControlCharacter_PARAGRAPH_BREAK, .f.)
orange.insertControlCharacter(loCursor, com_sun_star_text_ControlCharacter_APPEND_PARAGRAPH, .f.)
loCursor.gotoStartOfParagraph(.f.)
loCursor.gotoEndOfParagraph(.T.)
loCursor.ParaStyleName = "Limit_Sucty_Bold"

DO CASE
	CASE INLIST(lnvzortyp, 6)
		DO CASE
			CASE lcjazyk=='A'
				orange.insertstring(loCursor,"Total"+CHR(9)+CHR(9)+TRANSFORM(ROUND(lncena0, 2), "999 999 999.99")+" "+en__meny(llist5.c_mena,3)+CHR(10),.F.)
				IF lnprira<0
					orange.insertstring(loCursor,"Surcharge"+CHR(9)+IIF(lnprirb="P", TRANSFORM(lnprira)+" %",TRANSFORM(lnsl_p)+" "+en__meny(llist5.c_mena,3))+CHR(9)+TRANSFORM(ROUND(lnsl_p, 2), "999 999 999.99")+" "+en__meny(llist5.c_mena,3)+CHR(10),.F.)
				ENDIF
				IF lnprira>0
					orange.insertstring(loCursor,"Discount"+CHR(9)+IIF(lnprirb="P", TRANSFORM(lnprira)+" %",TRANSFORM(lnsl_p)+" "+en__meny(llist5.c_mena,3))+CHR(9)+TRANSFORM(ROUND(lnsl_p, 2), "999 999 999.99")+" "+en__meny(llist5.c_mena,3)+CHR(10),.F.)
				ENDIF
				IF lnprira<>0
					orange.insertstring(loCursor,CHR(10),.f.)
				ENDIF
				loCursor.collapseToEnd()
				orange.insertControlCharacter(loCursor, com_sun_star_text_ControlCharacter_PARAGRAPH_BREAK, .f.)
				orange.insertControlCharacter(loCursor, com_sun_star_text_ControlCharacter_APPEND_PARAGRAPH, .f.)
				loCursor.gotoStartOfParagraph(.f.)
				loCursor.gotoEndOfParagraph(.T.)
				loCursor.ParaStyleName = "Limit_Sucty_BezBoldu"
				orange.insertstring(loCursor,"SALE PRICE"+CHR(9)+CHR(9)+TRANSFORM(ROUND(lncena2, 0), "999 999 999.99")+" "+en__meny(llist5.c_mena,3)+CHR(10),.F.)
				orange.insertstring(loCursor,"Price incl. VAT"+CHR(10),.F.)
			CASE lcjazyk=='N'
				orange.insertstring(loCursor,"Total"+CHR(9)+CHR(9)+TRANSFORM(ROUND(lncena0, 2), "999 999 999.99")+" "+en__meny(llist5.c_mena,3)+CHR(10),.F.)
				IF lnprira<0
					orange.insertstring(loCursor,"Aufpreis"+CHR(9)+IIF(lnprirb="P", TRANSFORM(lnprira)+" %",TRANSFORM(lnsl_p)+" "+en__meny(llist5.c_mena,3))+CHR(9)+TRANSFORM(ROUND(lnsl_p, 2), "999 999 999.99")+" "+en__meny(llist5.c_mena,3)+CHR(10),.F.)
				ENDIF
				IF lnprira>0
					orange.insertstring(loCursor,"Preisermäßigung"+CHR(9)+IIF(lnprirb="P", TRANSFORM(lnprira)+" %",TRANSFORM(lnsl_p)+" "+en__meny(llist5.c_mena,3))+CHR(9)+TRANSFORM(ROUND(lnsl_p, 2), "999 999 999.99")+" "+en__meny(llist5.c_mena,3)+CHR(10),.F.)
				ENDIF
				IF lnprira<>0
					orange.insertstring(loCursor,CHR(10),.f.)
				ENDIF
				loCursor.collapseToEnd()
				orange.insertControlCharacter(loCursor, com_sun_star_text_ControlCharacter_PARAGRAPH_BREAK, .f.)
				orange.insertControlCharacter(loCursor, com_sun_star_text_ControlCharacter_APPEND_PARAGRAPH, .f.)
				loCursor.gotoStartOfParagraph(.f.)
				loCursor.gotoEndOfParagraph(.T.)
				loCursor.ParaStyleName = "Limit_Sucty_BezBoldu"
				orange.insertstring(loCursor,"TOTAL SUMME"+CHR(9)+CHR(9)+TRANSFORM(ROUND(lncena2, 2), "999 999 999.99")+" "+en__meny(llist5.c_mena,3)+CHR(10),.F.)
				orange.insertstring(loCursor,"Preis mit MWSt."+CHR(10),.F.)
			OTHERWISE
				IF INLIST(lnprirb,"P","A")
					orange.insertstring(loCursor,jaz("word_celkom_bez_zlavy")+CHR(9)+CHR(9)+TRANSFORM(ROUND(lncena0, 2), "999 999 999.99")+" "+en__meny(llist5.c_mena,3)+CHR(10),.F.)
					IF lnprira<0
						orange.insertstring(loCursor,jaz("word_prirazka")+CHR(9)+IIF(lnprirb="P", TRANSFORM(lnprira)+" %",TRANSFORM(lnsl_p)+" "+en__meny(llist5.c_mena,3))+CHR(9)+TRANSFORM(ROUND(lnsl_p, 2), "999 999 999.99")+" "+en__meny(llist5.c_mena,3)+CHR(10),.F.)
					ENDIF
					IF lnprira>0
						orange.insertstring(loCursor,jaz("word_poskytnuta_sleva")+CHR(9)+IIF(lnprirb="P", TRANSFORM(lnprira)+" %",TRANSFORM(lnsl_p)+" "+en__meny(llist5.c_mena,3))+CHR(9)+TRANSFORM(ROUND(lnsl_p, 2), "999 999 999.99")+" "+en__meny(llist5.c_mena,3)+CHR(10),.F.)
					ENDIF
					IF lnprira<>0
						orange.insertstring(loCursor,CHR(10),.f.)
					ENDIF
				ENDIF
				IF !m.cenalimitu
					orange.insertstring(loCursor,"Cena bez DPH"+CHR(9)+CHR(9)+TRANSFORM(ROUND(lncena3, 2), "999 999 999.99")+" "+en__meny(llist5.c_mena,3)+CHR(10),.F.)
				ENDIF 
				loCursor.collapseToEnd()
				orange.insertControlCharacter(loCursor, com_sun_star_text_ControlCharacter_PARAGRAPH_BREAK, .f.)
				orange.insertControlCharacter(loCursor, com_sun_star_text_ControlCharacter_APPEND_PARAGRAPH, .f.)
				loCursor.gotoStartOfParagraph(.f.)
				loCursor.gotoEndOfParagraph(.T.)
				loCursor.ParaStyleName = "Limit_Sucty_BezBoldu"
				orange.insertstring(loCursor,"Cena s DPH"+CHR(9)+CHR(9)+TRANSFORM(ROUND(lncena2, 2), "999 999 999.99")+" "+en__meny(llist5.c_mena,3)+CHR(10),.F.)
		ENDCASE
ENDCASE
IF m.lnvzortyp=6
	SET DATE TO (m.qsetdate)
ENDIF
orange=oosubor.getText() && Create text object
loCursor.collapseToEnd()
orange.insertControlCharacter(loCursor, com_sun_star_text_ControlCharacter_PARAGRAPH_BREAK, .f.)
orange.insertControlCharacter(loCursor, com_sun_star_text_ControlCharacter_APPEND_PARAGRAPH, .f.)
loCursor.gotoStartOfParagraph(.f.)
loCursor.gotoEndOfParagraph(.T.)
loCursor.ParaStyleName = "Limit_Polozky"
WITH orange
	IF  .NOT. EMPTY(lcpoznmem)
		.insertstring(loCursor,CHR(10)+TRANSFORM(lcpoznmem)+CHR(10),.F.)
	ENDIF
ENDWITH
sURL = oooconvertToURL(pcsoubor)
LOCAL ARRAY aOneArg(1)
aOneArg[1] = OOoPropertyValue( "Overwrite", .T. )
oosubor.storeAsUrl( sURL, @ aOneArg )
*ooopen = .NULL.
RELEASE ooopen
SELECT (lnselect)
RETURN
ENDPROC
**





*
*    Library of routines to manipulate OpenOffice.org.
*
*
* http://kosh.datateamsys.com/~danny/OOo/VisualFoxPro-OOo/LibOOo-2003-11-17-01.prg

*############################################################
*    Public API
*    High level routines.
*############################################################


* Return .T. if OpenOffice.org is installed.
* Return .F. if not installed.
FUNCTION OOoIsInstalled()
LOCAL oServiceManager
oServiceManager = .NULL.

LOCAL cOldErrHandler
cOldErrHandler = ON( "ERROR" )
ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) )
oServiceManager = OOoGetServiceManager()
ON ERROR &cOldErrHandler

* If we could create a Service Manager,
*  then OpenOffice.org must be installed.
RETURN NOT ISNULL( oServiceManager )
ENDFUNC




* Easy way to create a new Draw document.
FUNCTION OOoCreateNewDrawDocument()
LOCAL oDrawDoc
oDrawDoc = OOoOpenURL( "private:factory/sdraw" )
RETURN oDrawDoc
ENDFUNC


* Easy way to create a new Writer document.
FUNCTION OOoCreateNewWriterDocument()
LOCAL oWriterDoc
oWriterDoc = OOoOpenURL( "private:factory/swriter" )
RETURN oWriterDoc
ENDFUNC


* Easy way to create a new Calc document.
FUNCTION OOoCreateNewCalcDocument()
LOCAL oCalcDoc
oCalcDoc = OOoOpenURL( "private:factory/scalc" )
RETURN oCalcDoc
ENDFUNC


* Easy way to create a new Impress document.
FUNCTION OOoCreateNewImpressDocument()
LOCAL oImpressDoc
oImpressDoc = OOoOpenURL( "private:factory/simpress" )
RETURN oImpressDoc
ENDFUNC



FUNCTION OOoOpenFile( cFilename )
LOCAL cURL
cURL = OOoConvertToURL( cFilename )

LOCAL oDoc
oDoc = OOoOpenURL( cURL )
RETURN oDoc
ENDFUNC


PROCEDURE OOoTerminateProgram()
LOCAL oDesktop
oDesktop = OOoGetDesktop()
oDesktop.Terminate()

=__OOoReleaseCachedVars()
ENDPROC


* Convert a local filename to an OOo URL.
FUNCTION OOoConvertToURL( cFilename )
* Ensure leading slash.
IF LEFT( cFilename, 1 ) != "/"
	cFileName = "/" + cFileName
ENDIF

LOCAL cURL
cURL = CHRTRAN( cFilename, "\", "/" )    && change backslashes to forward slashes.
cURL = "file://" + cURL
RETURN cURL
ENDFUNC




*############################################################
*    Draw specific tools
*############################################################


* Page zero is the first page.
* Once you have a drawing document, obtain one of its pages.
FUNCTION OOoGetDrawPage( oDrawDoc, nPageNum )
LOCAL oPages
oPages = oDrawDoc.GetDrawPages()
LOCAL oPage
oPage = oPages.GetByIndex( nPageNum )
RETURN oPage
ENDFUNC


* Given a draw document, create a shape.
* The shape must be added to the draw page, by calling
*  the draw page's Add() method.
* The oPosition and oSize arguments are optional, but you may
*  pass a Point and Size struct for these arguments.

FUNCTION OOoMakeRectangleShape( oDrawDoc, oPosition, oSize )
LOCAL oShape
oShape = OOoMakeShape( oDrawDoc, "com.sun.star.drawing.RectangleShape", oPosition, oSize )
RETURN oShape
ENDFUNC

FUNCTION OOoMakeEllipseShape( oDrawDoc, oPosition, oSize )
LOCAL oShape
oShape = OOoMakeShape( oDrawDoc, "com.sun.star.drawing.EllipseShape", oPosition, oSize )
RETURN oShape
ENDFUNC

FUNCTION OOoMakeLineShape( oDrawDoc, oPosition, oSize )
LOCAL oShape
oShape = OOoMakeShape( oDrawDoc, "com.sun.star.drawing.LineShape", oPosition, oSize )
RETURN oShape
ENDFUNC

FUNCTION OOoMakeTextShape( oDrawDoc, oPosition, oSize )
LOCAL oShape
oShape = OOoMakeShape( oDrawDoc, "com.sun.star.drawing.TextShape", oPosition, oSize )
RETURN oShape
ENDFUNC


* Create and return a Point struct.
FUNCTION OOoPosition( nX, nY )
LOCAL oPoint
oPoint = OOoCreateStruct( "com.sun.star.awt.Point" )
oPoint.X = nX
oPoint.Y = nY
RETURN oPoint
ENDFUNC

* Create and return a Size struct.
FUNCTION OOoSize( nWidth, nHeight )
LOCAL oSize
oSize = OOoCreateStruct( "com.sun.star.awt.Size" )
oSize.Width = nWidth
oSize.Height = nHeight
RETURN oSize
ENDFUNC


* Given a shape, alter its position.
PROCEDURE OOoSetPosition( oShape, nX, nY )
LOCAL oPosition
oPosition = oShape.Position
oPosition.X = nX
oPosition.Y = nY
oShape.Position = oPosition
ENDPROC

* Given a shape, alter its size.
PROCEDURE OOoSetSize( oShape, nWidth, nHeight )
LOCAL oSize
oSize = oShape.Size
oSize.Width = nWidth
oSize.Height = nHeight
oShape.Size = oSize
ENDPROC


* Given a draw document, create a shape.
* Optional:  oPosition, oSize can receive a Point or Size struct.
FUNCTION OOoMakeShape( oDrawDoc, cShapeClassName, oPosition, oSize )
LOCAL oShape
oShape = oDrawDoc.CreateInstance( cShapeClassName )

IF (TYPE([oPosition])="O")  AND  (NOT ISNULL( oPosition ))
	oShape.Position = oPosition
ENDIF
IF (TYPE([oSize])="O")  AND  (NOT ISNULL( oSize ))
	oShape.Size = oSize
ENDIF

RETURN oShape
ENDFUNC



*############################################################
*    Color conversion utilities
*    --------------------------
*    Visual FoxPro and OpenOffice.org do not represent
*     color values the same way.
*    Conversion routines in both directions are provided
*     to keep things easy.
*    In addition, extremely convenient HSV routines are provided.
*    See LibGraphics for discussion of HSV color model.
*############################################################


* Similar to VFP's built in RGB() function.
* Pass in R,G,B values and out comes an OpenOffice.org color value.
* Note that this is DIFFERENT from how VFP constructs color values.
FUNCTION OOoRGB( nRed, nGreen, nBlue )
RETURN BITOR( BITOR( BITLSHIFT( nRed, 16 ), BITLSHIFT( nGreen, 8 ) ), nBlue )
ENDFUNC

* Translate between a Visual FoxPro color and an OpenOffice.org color
*  by using a simple formula.
* Pass in a VFP color, out comes an OOo color.  And vice versa.
FUNCTION OOoColor( nColor )
LOCAL nTranslatedColor
nTranslatedColor = (INT( nColor / 65536 )) + (INT( INT( nColor / 256 ) % 256 ) * 256) + (INT( nColor % 256 ) * 65536)
RETURN nTranslatedColor
ENDFUNC

* Extract the Red component from an OpenOffice.org color.
* SImilar to the RGBRed() function in LibGraphics.
FUNCTION OOoRed( nOOoColor )
*    RETURN INT( nOOoColor / 65536 )
RETURN BITRSHIFT( BITAND( nOOoColor, 0x00FF0000 ), 16 )
ENDFUNC

* Extract the Green component from an OpenOffice.org color.
* SImilar to the RGBGreen() function in LibGraphics.
FUNCTION OOoGreen( nOOoColor )
*    RETURN INT( INT( nOOoColor / 256 ) % 256 )
RETURN BITRSHIFT( BITAND( nOOoColor, 0x0000FF00 ), 8 )
ENDFUNC

* Extract the Blue component from an OpenOffice.org color.
* SImilar to the RGBBlue() function in LibGraphics.
FUNCTION OOoBlue( nOOoColor )
*    RETURN INT( nOOoColor % 256 )
RETURN BITAND( nOOoColor, 0x000000FF )
ENDFUNC

* Convenient way to construct an OOo color from HSV components.
* See LibGraphics for information about HSV.
* Note nHue is a number from 0.0 to 1.0.
FUNCTION OOoHSV( nHue, nSaturation, nBrightness )
LOCAL nColor
nColor = MakeHSVColor( nHue * 6.0, nSaturation, nBrightness )
nColor = OOoColor( nColor )
RETURN nColor
ENDFUNC

* Convenient way to extract the Hue component from an OOo color.
* See LibGraphics for information about HSV.
* Note nHue is a number from 0.0 to 1.0.
FUNCTION OOoHue( nOOoColor )
RETURN HSVHue( OOoColor( nOOoColor ) ) / 6.0
ENDFUNC

* Convenient way to extract the Saturation component from an OOo color.
* See LibGraphics for information about HSV.
FUNCTION OOoSaturation( nOOoColor )
RETURN HSVSaturation( OOoColor( nOOoColor ) )
ENDFUNC

* Convenient way to extract the Brightness component from an OOo color.
* See LibGraphics for information about HSV.
FUNCTION OOoBrightness( nOOoColor )
RETURN HSVValue( OOoColor( nOOoColor ) )
ENDFUNC



*############################################################



PROCEDURE DoNothing__ErrorHandler( pnError, pcErrMessage, pnLineNo, pcProgramFileSys16, pcProgram, pcErrorParamSys2018 )
ENDPROC


* Return the OpenOffice.org service manager object.
* Cache it in a global variable.
* Create it if not already cached.
FUNCTION OOoGetServiceManager()
IF (TYPE([goOOoServiceManager])!="O")  OR  ISNULL( goOOoServiceManager )
	PUBLIC goOOoServiceManager
	TRY 
		goOOoServiceManager = CREATEOBJECT( "com.sun.star.ServiceManager" )
	CATCH
		goOOoServiceManager = NULL
	ENDTRY 
ENDIF
RETURN goOOoServiceManager
ENDFUNC


* Sugar coated routine to ask the service manager to
*  create you an instance of some other OpenOffice.org UNO object.
FUNCTION OOoServiceManager_CreateInstance( cServiceName )
LOCAL oServiceManager
oServiceManager = OOoGetServiceManager()

LOCAL oInstance
oInstance = .NULL.

LOCAL cOldErrHandler
cOldErrHandler = ON( "ERROR" )
ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) )
oInstance = oServiceManager.createInstance( cServiceName )
ON ERROR &cOldErrHandler

IF ISNULL( oInstance )
	=__OOoReleaseCachedVars()
	oServiceManager = OOoGetServiceManager()
	oInstance = oServiceManager.createInstance( cServiceName )
ENDIF

RETURN oInstance
ENDFUNC


* Sugar coated routine to create any UNO struct.
* Use the Bridge_GetStruct() feature of the OLE-UNO bridge.
FUNCTION OOoCreateStruct( cTypeName )
LOCAL oServiceManager
oServiceManager = OOoGetServiceManager()

LOCAL oStruct
oStruct = .NULL.

LOCAL cOldErrHandler
cOldErrHandler = ON( "ERROR" )
ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) )
oStruct = oServiceManager.Bridge_GetStruct( cTypeName )
ON ERROR &cOldErrHandler

IF ISNULL( oStruct )
	=__OOoReleaseCachedVars()
	oServiceManager = OOoGetServiceManager()
	oStruct = oServiceManager.Bridge_GetStruct( cTypeName )
ENDIF

RETURN oStruct
ENDFUNC


* Return the OpenOffice.org desktop object.
* Cache it in a global variable.
* Create it if not already cached.
FUNCTION OOoGetDesktop()
IF (TYPE([goOOoDesktop])!="O")  OR  ISNULL( goOOoDesktop )
	PUBLIC goOOoDesktop
	goOOoDesktop = OOoServiceManager_CreateInstance( "com.sun.star.frame.Desktop" )
	COMARRAY( goOOoDesktop, 10 )
ENDIF
RETURN goOOoDesktop
ENDFUNC


*!*    * Return an instance of com.sun.star.reflection.CoreReflection.
*!*    * Cache it in a global variable.
*!*    * Create it if not already cached.
*!*    FUNCTION OOoGetCoreReflection()
*!*        IF (TYPE([goOOoCoreReflection])!="O")  OR  ISNULL( goOOoCoreReflection )
*!*            PUBLIC goOOoCoreReflection
*!*            goOOoCoreReflection = OOoServiceManager_CreateInstance( "com.sun.star.reflection.CoreReflection" )
*!*            COMARRAY( goOOoCoreReflection, 10 )
*!*        ENDIF
*!*        RETURN goOOoCoreReflection
*!*    ENDFUNC


*!*    * Create a UNO struct object and return it.
*!*    * This routine is now obsolete.
*!*    * See a superior implementation of this routine elsewhere
*!*    *  which uses the Bridge_GetStruct() feature of the OLE-UNO bridge.
*!*    FUNCTION OOoCreateStruct( cTypeName )
*!*        * Ask service manager for a CoreReflection object.
*!*        LOCAL oCoreReflection
*!*        oCoreReflection = OOoGetCoreReflection()
*!*
*!*        * Get the IDL Class for the type name.
*!*        LOCAL oXIdlClass
*!*        oXIdlClass = .NULL.

*!*        LOCAL cOldErrHandler
*!*        cOldErrHandler = ON( "ERROR" )
*!*        ON ERROR = DoNothing__ErrorHandler( ERROR(), MESSAGE(), LINENO(), SYS(16), PROGRAM(), SYS(2018) )
*!*            oXIdlClass = oCoreReflection.forName( cTypeName )
*!*        ON ERROR &cOldErrHandler
*!*
*!*        IF ISNULL( oXIdlClass )
*!*            =__OOoReleaseCachedVars()
*!*            oCoreReflection = OOoGetCoreReflection()
*!*            oXIdlClass = oCoreReflection.forName( cTypeName )
*!*        ENDIF
*!*
*!*        * Create a variable to hold the created Struct.
*!*        * Assign it some initial value.
*!*        LOCAL oStruct
*!*        oStruct = CREATEOBJECT( "relation" ) && assign some kind of object initially

*!*        * Ask the class definition to create an instance.
*!*        oXIdlClass.CreateObject( @oStruct )
*!*
*!*        RETURN oStruct
*!*    ENDFUNC


* Create a com.sun.star.beans.PropertyValue struct and return it.
FUNCTION OOoPropertyValue( cName, uValue, nHandle, nState )
LOCAL oPropertyValue
oPropertyValue = OOoCreateStruct( "com.sun.star.beans.PropertyValue" )

oPropertyValue.Name = cName
oPropertyValue.Value = uValue

IF TYPE([nHandle])="N"
	oPropertyValue.Handle = nHandle
ENDIF
IF TYPE([nState])="N"
	oPropertyValue.State = nState
ENDIF

RETURN oPropertyValue
ENDFUNC



* Open or Create a document from it's URL.
* New documents are created by URL's such as:
*    private:factory/sdraw
*    private:factory/swriter
*    private:factory/scalc
*    private:factory/simpress
FUNCTION OOoOpenURL( cURL )
*    LOCAL oPropertyValue
*    oPropertyValue = OOoCreateStruct( "com.sun.star.beans.PropertyValue" )

*    LOCAL ARRAY aNoArgs[1]
*    aNoArgs[1] = oPropertyValue
*    aNoArgs[1].Name = "ReadOnly"
*    aNoArgs[1].Value = .F.

* These two lines replace the alternate version above,
*  which are left commented for the insight they provide.
LOCAL ARRAY aNoArgs[1]
aNoArgs[1] = OOoPropertyValue( "Hidden", .F. )

LOCAL oDesktop
oDesktop = OOoGetDesktop()

LOCAL oDoc
oDoc = oDesktop.LoadComponentFromUrl( cURL, "_blank", 0, @ aNoargs )

* Make sure that arrays passed to this document are passed zero based.
COMARRAY( oDoc, 10 )

RETURN oDoc
ENDFUNC


PROCEDURE __OOoReleaseCachedVars()
RELEASE goOOoServiceManager, goOOoDesktop, goOOoCoreReflection
ENDPROC



*############################################################


* Experimental stuff



*SET PROCEDURE TO LibOOo ADDITIVE
*oDoc = OOoOpenFile( GetDesktopFolderPathname() + "test.sxw" )


* This is an attempt to print a document.
PROCEDURE PrintExperiment( oDoc )
LOCAL ARRAY aArgs[1]
aArgs[1] = OOoPropertyValue( "CopyCount", 1, -1, 0 )
*    aArgs[1] = OOoPropertyValue( "Collate", .F. )

oDoc.Print( @ aArgs )
ENDPROC


*############################################################


PROCEDURE TestOOoDraw()
* Create a drawing.
LOCAL oDoc
oDoc = OOoCreateNewDrawDocument()

* Get the first page of the drawing.
LOCAL oPage
oPage = OOoGetDrawPage( oDoc, 0 )

LOCAL nHue, nSaturation, nBrightness
LOCAL nRow, nCol
LOCAL oShape

* Now let's draw some rectangles.

*-----
*    Notes about HSV color notation.
* Imagine hue is a "rainbow" of colors, from 0.0 to 1.0.
* 0.0 is red, then you progress to orange, yellow, green, blue, purple, and
*  then back to red again.  (Not like a real rainbow.)  1.0 is red also.
* HSV colors are easy for HUMANS, while RGB colors are easy for COMPUTERS.
* Quick, what is the RGB for Pink?  Brown?
* In HSV, you would think Pink is a low-saturation red at full brightness,
*  thus you could say H=0.0, S=0.5, B=1.0; and that's off the top of my head.
* Brown is a low brightness Orange, so H=0.0888, S=1.0, B=0.6; right out of thin air.
* Need a highly contrasting color?  Easy in HSV coordinates.
* Just pick the opposite hue, maybe maximize saturation (opposite of other color),
*  and maybe also a min or max brightness.  Can't easily come up with highly
*  contrasting colors in RGB coordinates in RGB space.
* Need to "soften" colors?  Take each HSV coordinate, and lower the saturation
*  by 10 %.
* Need to "darken" colors?  Lower the brightness of each pixel by 10 %.
*-----

* Let's vary the hue and saturation, while keeping the brightness constant.
* But you could vary any two parameters, while keeping the third constant.

nBrightness = 1.0 && full brightness
FOR nRow = 0 TO 9
	FOR nCol = 0 TO 9
		* Create a shape
		oShape = OOoMakeRectangleShape( oDoc )
		* Calculate color
		nHue = nCol / 9 && hue varies *across* by column
		nSaturation = nRow / 9 && saturation varies *down* by row
		* set color of shape
		* oShape.FillColor = OOoRGB( 255, 255, 255 )
		oShape.FillColor = OOoHSV( nHue, nSaturation, nBrightness )
		* Position and size the shape
		OOoSetSize( oShape, 500, 500 ) && 1/2 cm by 1/2 cm
		OOoSetPosition( oShape, 1000 + nCol * 600, 1000 + nRow * 600 )
		* Add shape to page
		oPage.Add( oShape )
	ENDFOR
ENDFOR


* Let's vary the hue and saturation, while keeping the brightness constant.
* This time, we'll use less-brightness
* But you could vary any two parameters, while keeping the third constant.

nBrightness = 0.7 && less brightness
FOR nRow = 0 TO 9
	FOR nCol = 0 TO 9
		* Create a shape
		oShape = OOoMakeRectangleShape( oDoc )
		* Calculate color
		nHue = nCol / 9 && hue varies *across* by column
		nSaturation = nRow / 9 && saturation varies *down* by row
		* set color of shape
		oShape.FillColor = OOoHSV( nHue, nSaturation, nBrightness )
		* Position and size the shape
		OOoSetSize( oShape, 500, 500 ) && 1/2 cm by 1/2 cm
		OOoSetPosition( oShape, 9000 + nCol * 600, 1000 + nRow * 600 )
		* Add shape to page
		oPage.Add( oShape )
	ENDFOR
ENDFOR


* Let's vary the hue and brightness, while keeping the saturation constant.
* But you could vary any two parameters, while keeping the third constant.

nSaturation = 1.0 && full saturation
FOR nRow = 0 TO 9
	FOR nCol = 0 TO 9
		* Create a shape
		oShape = OOoMakeRectangleShape( oDoc )
		* Calculate color
		nHue = nRow / 9 && hue varies *down* by row
		nBrightness = nCol / 9 && brightness varies *across* by column
		* set color of shape
		oShape.FillColor = OOoHSV( nHue, nSaturation, nBrightness )
		* Position and size the shape
		OOoSetSize( oShape, 500, 500 ) && 1/2 cm by 1/2 cm
		OOoSetPosition( oShape, 1000 + nCol * 600, 9000 + nRow * 600 )
		* Add shape to page
		oPage.Add( oShape )
	ENDFOR
ENDFOR


* Let's vary the saturation and brightness, while keeping the hue constant.
* The hue will be yellow.
* But you could vary any two parameters, while keeping the third constant.

nHue = 0.1666 && yellow
FOR nRow = 0 TO 9
	FOR nCol = 0 TO 9
		* Create a shape
		oShape = OOoMakeRectangleShape( oDoc )
		* Calculate color
		nSaturation = nRow / 9 && saturation varies *down* by row
		nBrightness = nCol / 9 && brightness varies *across* by column
		* set color of shape
		oShape.FillColor = OOoHSV( nHue, nSaturation, nBrightness )
		* Position and size the shape
		OOoSetSize( oShape, 500, 500 ) && 1/2 cm by 1/2 cm
		OOoSetPosition( oShape, 9000 + nCol * 600, 9000 + nRow * 600 )
		* Add shape to page
		oPage.Add( oShape )
	ENDFOR
ENDFOR


* Gee, you don't suppose someone out there could take the knowledge represented
*  by this code and figure out how to make OpenOffice.org draw bar charts?

ENDPROC


PROCEDURE TestOOoCalc()
* Create a spreadsheet.
LOCAL oDoc
oDoc = OOoCreateNewCalcDocument()

* Get first sheet
LOCAL oSheet
oSheet = oDoc.getSheets().getByIndex( 0 )

* Plug in some stuff...
oSheet.getCellByPosition( 0, 0 ).setFormula( "Month" )
oSheet.getCellByPosition( 1, 0 ).setFormula( "Sales" )
oSheet.getCellByPosition( 0, 1 ).setFormula( "Jan" )
oSheet.getCellByPosition( 0, 2 ).setFormula( "Feb" )
oSheet.getCellByPosition( 0, 3 ).setFormula( "Mar" )
oSheet.getCellByPosition( 0, 4 ).setFormula( "Apr" )
oSheet.getCellByPosition( 0, 5 ).setFormula( "May" )
oSheet.getCellByPosition( 0, 6 ).setFormula( "Jun" )
oSheet.getCellByPosition( 1, 1 ).setValue( 3826 )
oSheet.getCellByPosition( 1, 2 ).setValue( 3504 )
oSheet.getCellByPosition( 1, 3 ).setValue( 2961 )
oSheet.getCellByPosition( 1, 4 ).setValue( 2504 )
oSheet.getCellByPosition( 1, 5 ).setValue( 2102 )
oSheet.getCellByPosition( 1, 6 ).setValue( 1756 )

LOCAL ARRAY aOneArg[1]
LOCAL cFile, cURL

*    cFile = GetDesktopFolderPathname()+"example"
cFile = "c:\example"

* Now save the spreadsheet.
cURL = OOoConvertToURL( cFile + ".sxw" )
aOneArg[1] = OOoPropertyValue( "Overwrite", .T. )
oDoc.storeToUrl( cURL, @ aOneArg )

* Now save it as Excel
cURL = OOoConvertToURL( cFile + ".xls" )
aOneArg[1] = OOoPropertyValue( "FilterName", "MS Excel 97" )
oDoc.storeToUrl( cURL, @ aOneArg )
ENDPROC




PROCEDURE CreateHueRainbow()
* Create a drawing.
LOCAL oDoc
oDoc = OOoCreateNewDrawDocument()

* Get the first page of the drawing.
LOCAL oPage
oPage = OOoGetDrawPage( oDoc, 0 )

LOCAL nHue, nSaturation, nBrightness
LOCAL nCol
LOCAL oShape

* Now let's draw some rectangles.

* Let's vary the hue and saturation, while keeping the brightness constant.
* But you could vary any two parameters, while keeping the third constant.

nBrightness = 1.0 && full brightness
nSaturation = 1.0 && full saturation
FOR nCol = 0 TO 200
	* Create a shape
	oShape = OOoMakeRectangleShape( oDoc )
	* Calculate color
	nHue = nCol / 200 && hue varies *across* by column
	* set color of shape
	* oShape.FillColor = OOoRGB( 255, 255, 255 )
	oShape.FillColor = OOoHSV( nHue, nSaturation, nBrightness )
	* Position and size the shape
	OOoSetSize( oShape, 52, 2000 ) && 0.05 cm by 2 cm
	OOoSetPosition( oShape, 1000 + nCol * 50, 1000 )
	oShape.LineStyle = 0
	* Add shape to page
	oPage.Add( oShape )
ENDFOR

LOCAL cFile, cURL
*    cFile = GetDesktopFolderPathname()+"hue rainbow"
cFile = "c:\hue rainbow"
cURL = OOoConvertToURL( cFile + ".sxd" )
LOCAL ARRAY aOneArg[1]
aOneArg[1] = OOoPropertyValue( "Overwrite", .T. )
oDoc.storeAsUrl( cURL, @ aOneArg )
*    oDoc.dispose()
ENDPROC








*oFF = createUnoService( "com.sun.star.document.FilterFactory" )
*oFilterNames = oFF.getElementNames()