<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
<!--***********************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 ***********************************************************-->
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Language" script:language="StarBasic">Option Explicit




Sub LoadLanguage()
	If InitResources(&quot;WebWizard&quot;,&quot;wwz&quot;) Then
		WebWiz_gErrContentNotFound = GetResText(1101)
		WebWiz_gErrStyleNotFound = GetResText(1102)
		WebWiz_gErrMainTemplateError = GetResText(1103)
		WebWiz_gErrWhileReloading = GetResText(1104)
		WebWiz_gErrWhileLoadStyles = GetResText(1105)
		WebWiz_gErrMainDocumentError = GetResText(1106)
		WebWiz_gErrMsg = GetResText(1107)
	End If
End Sub


Function GetWebWizardPaths() as Boolean
Dim TemplatePath as String
	TextureDir = GetOfficeSubPath(&quot;Gallery&quot;,&quot;www-back&quot;)
	If TextureDir &lt;&gt; &quot;&quot; Then
		GraphicsDir = GetOfficeSubPath(&quot;Gallery&quot;,&quot;www-graf/&quot;)
		If GraphicsDir &lt;&gt; &quot;&quot; Then
			BulletDir = GetOfficeSubPath(&quot;Gallery&quot;, &quot;bullets/&quot;)
			If BulletDir &lt;&gt; &quot;&quot; Then
				PhotosDir = GetPathSettings(&quot;Gallery&quot;, False, 1)
				If PhotosDir &lt;&gt; &quot;&quot; Then
					TemplatePath = GetOfficeSubPath(&quot;Template&quot;, &quot;wizard/web/&quot;)
					If TemplatePath &lt;&gt; &quot;&quot; Then
						SOBitmapPath = GetOfficeSubPath(&quot;Template&quot;, &quot;../wizard/bitmap&quot;)
						If SOBitmapPath &lt;&gt; &quot;&quot; Then
							GetWebwizardPaths() = True
							Exit Function
							End If
					End If
				End If
			End If
		End If
	End If
	DisposeDocument(oBaseDocument)
	GetWebWizardPaths() = False
End Function



Sub OpenWebDialog()
	Dim sBitmapPath as String
	Dim BufferNames() as String
	Dim SelList(0) as Integer
	SelList(0) = 0
	MainDialog = LoadDialog(&quot;WebWizard&quot;,&quot;WebWzrd&quot;)
	DialogModel = MainDialog.Model
	With DialogModel
		.cbHelp.Label = GetResText(1000)
		.Title = GetResText(1001)
		.cbCancel.Label = GetResText(1002)
		.cbGoOn.Label = GetResText(1003)
		.lblTemplate.Label = GetResText(1004)
		.lblStyle.Label = GetResText(1005)
		.hlnBackground.Label = GetResText(1006)
		.optTiled.Label = GetRestext(1007)
		.optArea.Label = GetResText(1008)
		.chkSaveasTemplate.Label = GetResText(1010)
	End With

	BufferNames() = ArrayfromMultiArray(Layout, 1)
	DialogModel.lbTemplate.StringItemList() = BufferNames()
	DialogModel.lbTemplate.SelectedItems() = SelList()


	BufferNames() = ArrayfromMultiArray(Style, 1)
	DialogModel.lbStyles.StringItemList() = BufferNames()
	DialogModel.lbStyles.SelectedItems() = SelList()
	sBitmapPath = SOBitmapPath &amp; &quot;webwizard.png&quot;

	DialogModel.ImagePreview.ImageURL = sBitmapPath
	ToggleOptionButtons(DialogModel, bWithBackGraphic)
	MainDialog.GetControl(&quot;lbTemplate&quot;).SetFocus()
	DialogModel.cbGoOn.DefaultButton = True
	DialogModel.ImagePreview.BackGroundColor = RGB(0,60,126)
End Sub</script:module>
